Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QML插件从C++; P>是否可以从C++加载QML插件,比如从 QPluginLoader >代码>来处理它的函数?在我的项目中,我有一个QML插件,里面有一个版本信息,我想从C++中读取它。_C++_Qt_Plugins_Qml - Fatal编程技术网

QML插件从C++; P>是否可以从C++加载QML插件,比如从 QPluginLoader >代码>来处理它的函数?在我的项目中,我有一个QML插件,里面有一个版本信息,我想从C++中读取它。

QML插件从C++; P>是否可以从C++加载QML插件,比如从 QPluginLoader >代码>来处理它的函数?在我的项目中,我有一个QML插件,里面有一个版本信息,我想从C++中读取它。,c++,qt,plugins,qml,C++,Qt,Plugins,Qml,示例: main() { // ... QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:///ui/views/mainwindow.qml"))); if (parser.isSet(verionsOption)) { QSharedPointer<QQmlExtensionPlugin> myPlugin = // load plugin

示例:

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();
}
main(){
// ...
qqmlaplicationengine;
发动机负荷(QUrl)(QStringletral(“qrc:///ui/views/mainwindow.qml")));
if(parser.isSet(verionselection)){
QSharedPointer myPlugin=//加载插件

std::cout答案是..。几个月后,我又回到了这个任务

因此,在qt源代码中,我们可以看到什么
QQmlExtensionPlugin
。它实际上是一个qt插件(我们可以通过
QPluginLoader
打开)-
QPlugin
。我认为它应该列在中

为了能够在应用程序中打开您的qml插件,您的插件类必须实现一些接口,您将在应用程序中使用
qobject\u 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
\ifndef MYPLUGIN\u H
#定义MYPLUGIN_H
#包括
类外部接口
{
公众:
虚拟常量QString pluginVersion()常量=0;
虚拟常量QString qxmppVersion()常量=0;
虚拟~ExternalInterface(){}
};
Q_DECLARE_接口(ExternalInterface,“com.my.ExternalInterface”)
MyPlugin类:公共QQmlExtensionPlugin,公共外部接口
{
Q_对象
Q_接口(外部接口)
Q_插件_元数据(IID“com.MyPlugin”)
公众:
无效注册表类型(常量字符*uri);
无效初始化引擎(QQmlEngine*引擎,常量字符*uri);
const QString pluginVersion()const final override;
常量QString qxmppVersion()常量最终覆盖;
};
#endif//MYPLUGIN\u 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";
    }
ExternalInterface*pluginVersion=nullptr;
#ifdef Q_OS_MACOS
常量QString fileSuffix=“.dylib”;
#否则
const QString fileSuffix=“.so”;
#恩迪夫
QPluginLoader qmlPlugin(QApplication::applicationDirPath()+”./PlugIns/quick/libmyplugin“+fileSuffix);
qmlPlugin.load();
if(qmlPlugin.isLoaded()){
pluginVersion=qobject_cast(qmlPlugin.instance());
}否则{
setFileName(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath)+“/fx/my/libmyplugin”+fileSuffix);
qmlPlugin.unload();
qmlPlugin.load();
if(qmlPlugin.isLoaded()){
pluginVersion=qobject_cast(qmlPlugin.instance());
}否则{

当然,你可以做到。你在例子中不读C++吗?