2015-01-23 6 views
3

QML 플러그인을 C++에서로드 할 수 있습니까? 예를 들어, QPluginLoader에서 함수로 작업 할 수 있습니까? 내 프로젝트에서는 버전 정보가있는 qml 플러그인이 있는데 C++에서이 플러그인을 읽고 싶다.QML Plugin from C++

예 :

main() { 
    // ... 
    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:///ui/views/mainwindow.qml"))); 

    if (parser.isSet(verionsOption)) { 
     QSharedPointer<QQmlExtensionPlugin> myPlugin = // load plugin 
     std::cout << "Version of plugin: " << myPlugin->version() << std::endl; 
    } 

    return app.exec(); 
} 
+0

물론 할 수 있습니다. 당신의 예제에서 C++로부터 읽지 않았습니까? – folibis

+0

@folibis hm, 어디? –

+0

myPlugin-> version() – folibis

답변

2

anwser이다 .. . 몇 달 후 다시이 일을 할 수있었습니다.

그래서 Qt 소스 코드에서 우리는 무엇이 QQmlExtensionPlugin인지 알 수 있습니다. 그것은 정말로 Qt 플러그인입니다 (우리는 QPluginLoader을 통해 열 수 있습니다) - QPlugin. 내 생각에 그것은 Qt's plugin type list에 나열되어야합니다.

응용 프로그램에서 qml 플러그인을 열려면 응용 프로그램에서 qobject_cast으로 캐스팅 할 인터페이스를 구현해야합니다. 내 프로젝트에 보이는 같은 :

#ifndef MYPLUGIN_H 
#define MYPLUGIN_H 

#include <QQmlExtensionPlugin> 

class ExternalInterface 
{ 
public: 
    virtual const QString pluginVersion() const = 0; 
    virtual const QString qxmppVersion() const = 0; 
    virtual ~ExternalInterface() {} 
}; 

Q_DECLARE_INTERFACE(ExternalInterface, "com.my.ExternalInterface") 

class MyPlugin : public QQmlExtensionPlugin, public ExternalInterface 
{ 
    Q_OBJECT 
    Q_INTERFACES(ExternalInterface) 
    Q_PLUGIN_METADATA(IID "com.MyPlugin") 

    public: 
     void registerTypes(const char *uri); 
     void initializeEngine(QQmlEngine *engine, const char *uri); 

     const QString pluginVersion() const final override; 
     const QString qxmppVersion() const final override; 
}; 

#endif // MYPLUGIN_H 
다음, 플러그인을 열 응용 프로그램의 MAIN.CPP에

:

ExternalInterface* pluginVersion = nullptr; 
#ifdef Q_OS_MACOS 
    const QString fileSuffix = ".dylib"; 
#else 
    const QString fileSuffix = ".so"; 
#endif 
    QPluginLoader qmlPlugin(QApplication::applicationDirPath() + "../PlugIns/quick/libmyplugin" + fileSuffix); 
    qmlPlugin.load(); 
    if (qmlPlugin.isLoaded()) { 
     pluginVersion = qobject_cast<ExternalInterface*>(qmlPlugin.instance()); 
    } else { 
      qmlPlugin.setFileName(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath) + "/fx/my/libmyplugin" + fileSuffix); 
     qmlPlugin.unload(); 
     qmlPlugin.load(); 
     if (qmlPlugin.isLoaded()) { 
      pluginVersion = qobject_cast<ExternalInterface*>(qmlPlugin.instance()); 
     } else { 
      qDebug() << "ERROR while opening plugin: " << qmlPlugin.errorString(); 
     } 
    } 

    if (pluginVersion) { 
     qDebug() << "Plugin: \n" << pluginVersion->pluginVersion() << "\n" 
       << pluginVersion->qxmppVersion() << "\n" 
       << "Location: " << qmlPlugin.fileName(); 
    } else { 
     qDebug() << "Can't obtain version information from the plugin"; 
    } 

여기에 최악의 일은 당신이 플러그인에 전체 경로를 제공해야한다는 것입니다 (공유 라이브러리) 다른 시스템에 설치되는 위치를 알아야합니다.