我的目标是在qml文件中描述qml项目,然后使用相应的C ++类添加到此项目的可视化表示中。
我知道可以描述一个qml项目并在qml文件中使用它,并通过信号/插槽与它进行通信。
我也知道可以使用QQuickPaintedItem在C ++中描述qml项目,并在qml文件中使用它(通过注册机制使其可用)。还有其他方法吗?
那么,实际问题是可以将两者结合在一起吗? 所以,我希望有一个qml项和一个c ++类绘制相同的区域,例如我在c ++中有特定的OpenGL代码,并且在qml中定义了一个通常的Rectangle Frame和MouseArea。
答案 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期间以及在显示之前。