我的目标是描述qml文件中的qml项,然后使用相应的C++类添加到该项的可视化表示中。
我知道可以描述一个qml项目,并在qml文件中使用它,并通过信号/插槽从c++与它进行通信。
我还知道,可以在C++中使用QQuickPaintedItem描述qml项,并在qml文件中使用它(通过注册机制使其可用)。还有别的办法吗?
那么,实际的问题是能否将两者结合在一个项目中呢?因此,我希望有一个qml项和一个c++类来绘制相同的区域,例如,我在c++中有特定的OpenGL代码,还有一个在qml中定义了MouseArea的常规矩形框架。
发布于 2016-07-13 17:08:08
在得到Andrej的提示之后,我决定通过创建一个从C++派生的包装类,并通过它覆盖paint方法,实现我的目标: qml表示和一个QQuickPaintedItem呈现类。有了这个,我可以在代码中呈现到项中。该项在我的主qml文件中使用。
它是一个包装类,因为它加载了我想要通过QQmlComponent显示的qml文件,它也创建了我想要显示的QuickItem。为此,我将加载/创建项的父项设置为我的包装类。因此,在我的QuickPaintedItem类中(最好在类engine中完成,当引擎已经初始化时):
QQmlComponent component(engine,QUrl("qrc:/myqml.qml")); QObject* object = component.create(); QQuickItem* quickItem = qobject_cast<QQuickItem*>(object); quickItem->setParentItem(this);
然后呈现myqml.qml和我的画图方法。我有一个中央的地方我可以用这两种。
在Velkan的注释之后,另一种方法是将组件加载到一个加载器 qml项中:
Wrapper { Loader{ onQmlChanged: source = newQml } }
其中,onQmlChanged将是消耗信号的时隙:
signal onQmlChanged(string newQml);
我不能说哪一种方式表现更好。在qml中定义结构似乎更容易、更干净。代码版本的一个不同之处在于,它在包装器创建时加载项,因此在创建main.qml期间和显示项目之前都是如此。
https://stackoverflow.com/questions/38345159
复制相似问题