在 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 创建期间和显示之前。