以C+;的形式访问QML插件代码+;对象 我用C++创建了两个QML插件。插件A表示一些特定的UI项类型,插件B表示自己的“存储”单例QML项类型。最初的动机是创建QML存储单例,并通过大部分QML UI代码使用它。现在,我还希望A和B之间的直接交互,意思是它们通过C++代码绕过QML相互作用。只有A需要知道B,而不是相反。我怎样才能做到这一点
不需要以C+;的形式访问QML插件代码+;对象 我用C++创建了两个QML插件。插件A表示一些特定的UI项类型,插件B表示自己的“存储”单例QML项类型。最初的动机是创建QML存储单例,并通过大部分QML UI代码使用它。现在,我还希望A和B之间的直接交互,意思是它们通过C++代码绕过QML相互作用。只有A需要知道B,而不是相反。我怎样才能做到这一点,c++,qt,qml,C++,Qt,Qml,不需要rootObject->findChild所需的解决方案类型。这个问题有点类似,除了我需要能够从C++中的QML插件动态库实例化对象。我看到了QML和C++代码使用的动态库的表面解决方案。但它有点复杂:它必须只是一个包含数据的代码实例。此外,可能还有一种方法可以将plugin对象的实例QML以某种方式“强制转换”到普通的Qt-plugin,然后从中调用我想要的任何东西 我认为这也适用于插件,而不仅仅是注册类型。我现在无法尝试,我将在当天晚些时候尝试后删除此行: C++中定义的每个QML单
rootObject->findChild
所需的解决方案类型。这个问题有点类似,除了我需要能够从C++中的QML插件动态库实例化对象。我看到了QML和C++代码使用的动态库的表面解决方案。但它有点复杂:它必须只是一个包含数据的代码实例。此外,可能还有一种方法可以将plugin对象的实例QML以某种方式“强制转换”到普通的Qt-plugin,然后从中调用我想要的任何东西
我认为这也适用于插件,而不仅仅是注册类型。我现在无法尝试,我将在当天晚些时候尝试后删除此行:
C++中定义的每个QML单体需要具有签名的静态方法:
static QObject* someName(QQmlEngine *, QJSEngine *);
返回指向该类的单个实例的指针
我认为通常不需要使用QQmlEngine
或QJSEngine
使其工作,因此可以通过添加第二个静态方法轻松实现完整的单例模式:
static QObject* instance();
返回的结果完全相同。
你也可以选择
static MySingletonObject* instance();
所以你不需要在事后施展
现在您只需导入类,就可以通过调用这个静态方法访问同一个实例
如果上述方法不起作用,您可能会采用黑客方式: 您也可以使用根节点并设置属性:
property QtObject mySingleton: MySingleton
然后可以使用findChild
获取根节点并读取相同的属性。要做到这一点,您可能需要在之前访问singleton的某些内容,否则实例可能会丢失
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定义的单例,您可能需要访问单例一次,然后才能分配它。我不知道这其中的内在原因
您的方法是合乎逻辑的,但我还无法解决GCC运行时错误
未定义符号_ZNK9MyQmlType10metaObjectEv
。因此,除非插件动态库已经按照插件加载的方式加载,否则似乎没有办法这样做qmlRegister*
如果类型类型的实现不可访问,函数就无法注册类型。您在哪里采取哪种方法?你能创建一个MCVE吗?我决定用它来解决我并不想要的问题,但至少它是可行的。