QT QML项目,包括C ++和QML

时间:2016-07-13 07:24:22

标签: c++ qt qml qquickitem

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

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

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

那么,实际问题是可以将两者结合在一起吗? 所以,我希望有一个qml项一个c ++类绘制相同的区域,例如我在c ++中有特定的OpenGL代码,并且在qml中定义了一个通常的Rectangle Frame和MouseArea。

1 个答案:

答案 0 :(得分:0)

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

它是一个包装类,因为它加载了我想通过QQmlComponent显示的qml文件,它创建了我想要显示的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和我的paint方法。我有一个可以同时使用它们的中心位置。

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

Wrapper { Loader{ onQmlChanged: source = newQml } }

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

signal onQmlChanged(string newQml);

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