1

我的目标是在 qml 文件中描述一个 qml 项目,然后使用相应的 C++ 类添加到该项目的可视化表示中。

我知道可以描述一个 qml 项目并在 qml 文件中使用它,并通过信号/插槽从 c++ 与它进行通信。

我也知道可以使用 QQuickPaintedItem 在 C++ 中描述一个 qml 项目,并在 qml 文件中使用它(通过注册机制使其可用)。还有其他方法吗?

那么,实际的问题是可以将两者结合在一个项目中吗?所以,我想要一个 qml 项目一个 c++ 类绘制相同的区域,例如我在 c++ 中有特定的 OpenGL 代码和一个在 qml 中定义的带有 MouseArea 的常用矩形框。

4

1 回答 1

0

在 Andrej 的提示之后,我决定通过创建一个派生自 QQuickPaintedItem 的包装类并通过重写paint方法来实现我的目标,即同时拥有 qml 表示和 C++ 呈现类。有了这个,我可以在代码中渲染到项目中。该项目在我的主 qml 文件中使用。

它是一个包装类,因为它通过一个 QQmlComponent 加载我想要显示的 qml 文件,该 QQmlComponent 也创建了我想要显示的 QuickItem。我通过将加载/创建的项目的父项设置为我的包装类来做到这一点。所以在我的 QuickPaintedItem 类中(最好在 classbegin 中完成,当引擎已经初始化时):

QQmlComponent component(engine,QUrl("qrc:/myqml.qml")); QObject* object = component.create(); QQuickItem* quickItem = qobject_cast<QQuickItem*>(object); quickItem->setParentItem(this);

然后渲染 myqml.qml 和我的绘画方法。而且我有一个可以同时使用两者的中心位置。

在 Velkan 的评论之后,另一种方法是将组件的加载放在Loader qml 项中:

Wrapper { Loader{ onQmlChanged: source = newQml } }

其中 onQmlChanged 将是一个消耗信号的插槽:

signal onQmlChanged(string newQml);

我不能说哪种方式性能更好。在 qml 中定义结构似乎更容易和更清晰。与代码版本不同的是,它在 Wrapper 创建时加载项目,因此在 main.qml 创建期间和显示之前。

于 2016-07-13T17:08:08.977 回答