gpt4 book ai didi

c++ - C++ 和 QML 中的 QT QML 项

转载 作者:太空宇宙 更新时间:2023-11-04 13:14:00 24 4
gpt4 key购买 nike

我的目标是在 qml 文件中描述一个 qml 项目,然后使用相应的 C++ 类添加到该项目的可视化表示中。

我知道可以描述一个 qml 项并在 qml 文件中使用它,并通过信号/槽从 C++ 与它通信。

我还知道可以使用 QQuickPaintedItem 在 C++ 中描述一个 qml 项,并在 qml 文件中使用它(通过注册机制使其可用)。还有其他方法吗?

那么,实际问题是可以将两者结合在一个项目中吗?所以,我想要一个 qml 项 一个绘制相同区域的 c++ 类,例如我在 c++ 中有特定的 OpenGL 代码,在 qml 中定义了带有 MouseArea 的常用矩形框架。

最佳答案

在 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 中定义结构似乎更容易、更清晰。与代码版本的不同之处在于,它在创建包装器时加载项目,因此在创建 main.qml 期间和显示之前。

关于c++ - C++ 和 QML 中的 QT QML 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38345159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com