2017-07-07 67 views
1

创建的类之间交换日期我有以下问题关于装载有QML Loader(setSource("qmlObject.qml")).设为Qml - C++类和由QmlRegisterType

qmlObject.qml我已导入objectClass(.h/.cpp)qmlRegisterType创建,QML对象从而当我启动loader.setSource("qmlObject.qml")命令的实例objectClass(.h/.cpp)已创建。

我有其他主要类名为coreClass(.h/.cpp),我应该在objectClass(.h/.cpp)coreClass(.h/.cpp)之间交换数据。

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

回答

3

有两种方法做到这一点:

  1. 在C++水平,因为两者的对象是C++对象,你可以跳过使用QML作为中间人和直接通信。据推测,你的核心类将是整个应用程序的核心类,所以你可以将它公开为静态成员指针,指向对象类中的核心。因此所有对象类实例都可以访问它。

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

第一种方法的性能明智得多,会使用更少的内存,不利的一面是你必须在每次更改时重新编译C++代码。

第二种方法将交互限制为QML中可见的内容,即QML中的属性,信号,插槽和函数已被标记为可调用。它会变慢并且使用更多的内存,但是在好处上你不需要重新编译,所以原型设计要快得多。

通常这样的交互将基于GUI,所以开销并不重要,因为用户每秒不会与GUI交互数千次。如果效率是关键,那么您可以使用第二种方法进行原型设计,并使得运行速度更快,并且只需将代码移植到第一个解决方案。

还有一点很重要,就是当你将C++用于QML集成时,正确的方法是将C++的东西暴露给QML并从QML中使用它。你永远不应该从C++到QML中的任意东西,这是错误设计的一个标志。

0

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

+0

但objectClass的实例是从qml Loader生成的,而不是从coreClass生成的。从coreClass我不知道什么是相对objectClass交换插槽和信号。 – daniele86

+0

我不知道是什么意思:'objectClass的实例是从qml Loader生成的'。但是您可以在main()函数中声明objectClass和coreClass,然后将它们传递给qml。这样你就可以将指针传递给对方。 –