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->findChild("myobject") 我可以在 C++ 中使用 qml 对象。问题是,是否有一个像 QQuickPaintedItem 但也可以具有 qml 视觉表示的对象。 qt.labs.templates 看起来很有趣。 您可以将 C++ 和 QML 组合在一个元素中,方法是将 QQuickPaintedItem 派生元素放在 QML 元素之上。您可以通过调整 z 属性或仅通过在单个 QML 文件中相应地对元素进行排序来做到这一点。由于 QQuickPaintedItem 具有透明背景,您将看到 C++ 和 QML 的绘图输出。 只需在 QML 中添加内容:MyPaintedItem 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?

Qt中使用QML和Listview的问题

尝试在 Blackberry Cascades QT 和 QML 中下载图像

QML 可以替代 Qt 中的 OpenGL 吗?