gpt4 book ai didi

c++ - 以 C++ 对象的形式访问 QML 插件代码

转载 作者:行者123 更新时间:2023-11-30 05:09:06 25 4
gpt4 key购买 nike

我用 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 插件,然后从中调用我想要的任何内容。

最佳答案

I think this should also work for Plugins and not only for registered types. I can't try it right now, I will remove this line once I tried it out later that day:

每个用 C++ 定义的 QML 单例都需要有一个带有签名的静态方法:

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

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

我认为通常你不需要 QQmlEngineQJSEngine 来让它工作,所以你可以通过添加第二个静态方法轻松实现完整的 Singleton-Pattern :

static QObject* instance();

返回的结果完全一样。你也可以有一个

static MySingletonObject* instance();

所以你之后不需要转换。

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


If above does not work, you might do it the hacky way:

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

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'
}

This solution works for me for QML-defined qmldir-registered singletons, as well as C++-defined and qmlRegisterSingleton(...)-registered singletons. With QML-defined singletons you might need access the singleton once, before you can assign it. I don't know the internal reasons for that.

关于c++ - 以 C++ 对象的形式访问 QML 插件代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46356975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com