您如何注册相互依赖的 Qt QML Singleton?

Posted

技术标签:

【中文标题】您如何注册相互依赖的 Qt QML Singleton?【英文标题】:How do you register Qt QML Singleton's that depend on each other? 【发布时间】:2018-06-19 15:32:31 【问题描述】:

我正在使用一些 C++ 和一些 javascript/QML 构建一个 Qt 应用程序。

我想向 QML 引擎注册三个全局单例,A、B 和 C。我可以使用this method独立注册每个对象。

A、B 和 C 需要有权访问传递给单例提供程序的 QMLEngine。

现在假设 B 和 C 依赖于 A;特别是 A 的全局实例需要传入 B 和 C 的构造函数中。如何实例化和注册这些类型?

【问题讨论】:

您是否考虑过一种使用单例反模式的设计? @JesperJuhl 是的;在这种情况下,A、B 和 C 代表真正是单例的硬件资源。 使用延迟初始化 【参考方案1】:

作为一个被那个非常糟糕的人刺痛的人,我强烈建议不要去那里,趁着还能回头。

Qt had a bug with inter-referencing singletons that unfortunately was only partially solved, and it doesn't look like it will get resolved any time soon.

该错误导致 QML 引擎加载偶尔(10-20% 的时间)静默失败,没有错误,没有警告,没有应用程序窗口……没有任何东西。只是一个卡住的死进程。

如果可能,将 A、B 和 C 实现为一个单例的子对象。然后,您仍然可以将它们单独公开为单例的属性。

【讨论】:

感谢@dtech;我很高兴知道这件事。您可以链接到错误票以供参考吗?目前,我正在按照你说的做——将每个子对象暴露为单个单例的属性。它很丑,但很管用。

以上是关于您如何注册相互依赖的 Qt QML Singleton?的主要内容,如果未能解决你的问题,请参考以下文章

Qt在线讲座之QML脚本书写规范

Qt Qml连接到Context属性的QObject属性的信号

如何在Qt C++中解析JSON数据并使之被QML应用 / 蓝讯

将 Qt 函数导入 QML 文件?

Qt for python 的属性系统使用,并注册python到qml使用

qt qgraphicsWidget注册为qml类型并绘制图形,但添加任何动画后图形不流畅