C++ 和 QML 中的 QT QML 项
Posted
技术标签:
【中文标题】C++ 和 QML 中的 QT QML 项【英文标题】:QT QML Items both in C++ and QML 【发布时间】:2016-07-13 07:24:21 【问题描述】:我的目标是在 qml 文件中描述一个 qml 项目,然后使用相应的 C++ 类添加到该项目的可视化表示中。
我知道可以描述一个 qml 项目并在 qml 文件中使用它,并通过信号/插槽从 c++ 与它通信。
我也知道可以使用 QQuickPaintedItem 在 C++ 中描述一个 qml 项目,并在 qml 文件中使用它(通过注册机制使其可用)。还有其他方法吗?
那么,实际的问题是可以将两者结合在一个项目中吗? 所以,我想要一个 qml 项目和一个 c++ 类绘制相同的区域,例如我在 c++ 中有特定的 OpenGL 代码和一个在 qml 中定义的带有 MouseArea 的常用矩形框。
【问题讨论】:
用 C++ 创建您自己的项目。 C++ 是编译语言,qml 被解释(在运行时),所以不可能在编译时使用 qml 定义。 使用 QQuickPaintedItem 我可以在 qml 中使用 C++ 对象。使用 object->findChildMyPaintedItem Rectangle
并将其保存到 MyPaintedItemWithRectangle.qml
。然后使用MyPaintedItemWithRectangle
类型。
@Velkan 这对代码中的渲染没有帮助。
【参考方案1】:
在 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的cmets之后,另一种方式是将组件的加载放在一个Loaderqml项中:
Wrapper Loader onQmlChanged: source = newQml
其中 onQmlChanged 是一个消耗信号的槽:
signal onQmlChanged(string newQml);
我不能说哪种方式性能更好。在 qml 中定义结构似乎更容易和更清晰。与代码版本不同的是,它在 Wrapper 创建时加载项目,因此在 main.qml 创建期间和显示之前。
【讨论】:
它与Wrapper MyQml
有何不同? Wrapper
是一个 QQuickPaintedItem
,它是 myqml.qml
文件中 MyQml
的父级。
我可以在运行时加载 qml。这是一个要求。
运行时:Wrapper Loadersource:...
.
源码,qml文件的文件名也是运行时读取的。
全部在运行时,动态:Wrapper Loader onSomething: source = "myqml.qml"
以上是关于C++ 和 QML 中的 QT QML 项的主要内容,如果未能解决你的问题,请参考以下文章
Qt/QML - 在 C++ 中注册 QML 类型会使 QML 代码不起作用
检测鼠标光标何时在 Qt5 和 QML 中的不规则形状图片上
如何将 Qt 中的 SQL 查询输出模型分配给 QML 的 TableView?