将QML插件代码作为C ++对象访问

时间:2017-09-22 04:39:10

标签: c++ qt qml

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

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

1 个答案:

答案 0 :(得分:1)

  

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

在C ++中定义的每个QML Singleton都需要一个带签名的静态方法:

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

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

我认为通常您不需要QQmlEngineQJSEngine来使其正常工作,因此您可以通过添加第二个静态方法轻松实现完整的Singleton-Pattern:

static QObject* instance();

返回完全相同。 你可以选择

static MySingletonObject* instance();

所以你以后不需要施放。

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

  

如果上述方法不起作用,你可以采用hacky方式:

您也可以使用根节点并设置属性:

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定义的单例,您可能需要访问单例一次,然后才能分配它。我不知道内部原因。