Qml - QmlRegisterType 创建的 c++ class 和 class 之间的交换日期

Qml - Exchange date between c++ class and class created by QmlRegisterType

关于用 qml 加载的 qml 对象,我有以下问题 Loader (setSource("qmlObject.qml")).

qmlObject.qml 中,我导入了使用 qmlRegisterType 创建的 objectClass(.h/.cpp),因此当我启动 loader.setSource("qmlObject.qml") 命令时,会创建一个 objectClass(.h/.cpp) 的实例。

我有另一个名为 coreClass(.h/.cpp) 的主要 class,我应该在 objectClass(.h/.cpp)coreClass(.h/.cpp) 之间交换数据。

在我的简单 qt 应用程序中实现此功能的最佳做法是什么?

您可以使用 SIGNAL 和 SLOT 机制轻松地在 c++ 类 之间交换数据。 只需将 coreClass 的指针传递给 objectClass 并连接信号和插槽。

有两种方法可以做到这一点:

  1. 在 C++ 层面上,因为你的两个对象都是 C++ 对象,你可以跳过使用 QML 作为中介并直接通信。大概您的核心 class 将是整个应用程序的核心,因此您可以将其公开为指向对象 class 中核心的静态成员指针。因此所有对象 class 实例都可以访问它。

  2. 在 QML 级别,通过将核心 class 作为上下文 属性 或最好作为单例公开给 QML,因为后者是最有效的方式。然后你可以以定义的功能接口的形式使用它的属性、信号和插槽(但不是纯 public C++ 的东西)。

第一种方法在性能方面会更快,并且会使用更少的内存,缺点是您必须在每次更改时重新编译 C++ 代码。

第二种方法将交互限制为 QML 中可见的内容,即属性、信号、槽和已标记为可调用的函数。它会更慢并使用更多内存,但从好的方面来说,您不必重新编译,因此原型制作要快得多。

通常此类交互是基于 GUI 的,因此开销并不重要,因为用户不会每秒与 GUI 交互数千次。如果效率是关键,您可以使用第二种方法进行原型设计并更快地获得结果 运行,完成后只需将代码移植到第一种解决方案。

同样重要的是,当您将 C++ 集成到 QML 时,正确的方法是将 C++ 内容暴露给 QML 并从 QML 中使用它。您永远不必从 C++ 访问 QML 中的任意内容,这表明设计错误。