Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.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
以C+;的形式访问QML插件代码+;对象 我用C++创建了两个QML插件。插件A表示一些特定的UI项类型,插件B表示自己的“存储”单例QML项类型。最初的动机是创建QML存储单例,并通过大部分QML UI代码使用它。现在,我还希望A和B之间的直接交互,意思是它们通过C++代码绕过QML相互作用。只有A需要知道B,而不是相反。我怎样才能做到这一点_C++_Qt_Qml - Fatal编程技术网

以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吗?我决定用它来解决我并不想要的问题,但至少它是可行的。