2017-09-22 27 views
1

我用C++创建了两个QML插件。插件A代表一些特定的UI项目类型,插件B代表自己的“存储”单例QML项目类型。最初的动机是创建QML存储单例,并通过大多数QML UI代码使用它。现在我也想要A和B之间的直接交互,这意味着它们仅仅在C++代码中绕过QML而彼此交互。只有A需要了解B,而不是相反。我怎样才能做到这一点?以C++对象的形式访问QML插件代码

rootObject->findChild需要的解决方案类型。这个问题有点类似于Accessing QML objects from C++,除了我需要能够从C++中的QML PlugIn动态库实例化对象。我看到使用QML和C++代码的动态库的表面解决方案。但它有点复杂:它只能是一个带有数据的代码实例。也有可能以某种方式将插件对象的QML实例“转换”为普通的Qt插件,然后调用我想要的任何东西。

回答

1

我认为这也应该适用于插件,而不仅仅适用于注册类型。我不能尝试它,现在,当我尝试过了那天晚些时候我会删除此行:

每个QML辛格尔顿,C++定义需要有签名的静态方法:

static QObject* someName(QQmlEngine *, QJSEngine *); 

返回一个指向这个类的单个实例的指针。

我通常会认为你不需要QQmlEngineQJSEngine,使其工作,所以你可以很容易地通过添加第二个静态方法实现完整的单例模式:

static QObject* instance(); 

返回一模一样。 你可能会有一个

static MySingletonObject* instance(); 

所以你不需要后来施放。

现在您只需导入您的类,并且您将通过调用此静态方法访问同一个实例。


如果以上不工作,你可能会做它的哈克的方式:

您也可以使用您的根节点,并设置一个属性:

property QtObject mySingleton: MySingleton 

然后你可以使用findChild来获取您的根节点并阅读相同的属性。为了能够做到这一点,你可能需要先访问单例的东西,否则实例可能会丢失。

property Item singl: MySingleton 

Component.onCompleted: { 
    // MySingleton.color = 'green' // If this line is commented out, it will fail for me for a QML-defined Singleton at least. 
    singl.color = 'red' 
} 

该解决方案适用于我QML定义qmldir注册的单身人士,以及C++ - 定义和qmlRegisterSingleton(...) - 注册单身。使用QML定义的单例,您可能需要访问单例,然后才能分配它。我不知道这个的内部原因。

+0

您的方法是合乎逻辑的,但我无法解析GCC运行时错误“未定义符号_ZNK9MyQmlType10metaObjectEv”。因此,除非插件动态库已经被加载,否则插件加载似乎没有办法。 'qmlRegister *'函数不能注册类型,而不实现可访问的类型类型。 – AlexanderVX

+0

你采取哪种方法?你能创建一个MCVE吗? – derM

+0

我决定使用https://stackoverflow.com/questions/28112038/qml-plugin-load-from-c来解决这个我并不真正想要的解决方法,但至少这是可行的。 – AlexanderVX