如何在 Qt Quick 中将 QML 项目转换为相应的 C++ 项目

Posted

技术标签:

【中文标题】如何在 Qt Quick 中将 QML 项目转换为相应的 C++ 项目【英文标题】:How do I cast QML items to corresponding C++ Item in Qt Quick 【发布时间】:2014-05-02 20:28:42 【问题描述】:

我的问题最好通过一个例子来澄清。我有带有 Text 项目的 QML。在 C++ 中,我可以访问此项目,并且使用 qobject_cast 将任何内容转换为 QQuickItem* 没有问题。但是如何将它变成最接近的对应项,以便我可以直接调用更具体的方法,如setText(),就像我可能调用setWidth() 一样?我意识到我可以使用通用的 setProperty() 方法,但是我在编译时检查了转换提供的功能。

我正在寻找一个更一般的答案来查找 QML 与其 C++ 类之间的对应关系,以便我可以了解如何为 Rectangles、MenuBars 等执行此操作。我似乎在文档中找不到这个。对于那些喜欢代码示例的人:

auto text_object = app_item->findChild<QObject*>("myTextArea");
text_object->setProperty("text","New Text set from Code"); //THIS WORKS BUT...
auto text_qitem = qobject_cast<QQuickItem*>(text_object);
text_qitem->setWidth(128);
auto text_quick_text = qobject_cast<WHATGOESHERE???*>(text_object);
text_quick_text->setText("new Text for qml item");  //I WANT TO DO THIS

【问题讨论】:

您假设每个 qtquick 控件都有一个本机 c++ 类,可能不是这样.. 我只是希望在某处存在说明存在哪些对应关系的文档是否是这种情况。例如,我可以将 engine.rootObjects 的第 0 个元素转换为 QQuickWindow。但我是通过猜测得出的。 @perencia: 有... @Tod:你can get the classname,但老实说,我不确定如何将字符串转换为对象转换。 这让我想到了只使用调试器。我可以看到应用程序的所有子项,并且 Text 项的类型为 QQuickText。不幸的是,我找不到可以让我投射到这个的包含。 【参考方案1】:

问:但我在编译时间后检查转换提供的功能。

qobject_cast 不提供任何编译时检查。它都是运行时和动态的,因此这个请求是不合理的。上下文属性很好,或者您也可以使用QMetaObject 获取类名。然后,您可以构建一个静态 LUT,但总体而言,这些努力可能不值得......

【讨论】:

好的,看来我可以从 QMetaObject 获得相同类型的安全性。我真的只是想更好地理解这一切。我仍然想知道我将使用什么来将某些内容投射到 Text。真的,我一般想知道如何在文档中找到 Qt Quick 类(如 Text)与 C++ 等价物之间的对应关系。也许它没有被记录,因为它开始出现了,尽管我在文档中看到了这种技术,但以这种方式做事并不是正确的技术。

以上是关于如何在 Qt Quick 中将 QML 项目转换为相应的 C++ 项目的主要内容,如果未能解决你的问题,请参考以下文章

Qt Quick - 如何仅通过 c++ 代码与 qml 属性交互

[Qt Quick 踩坑] QML端函数参数未定义

qt-quick(qml) 应用程序无法订阅 ros 主题

项目错误:QT 中的未知模块:qml quick

如何创建具有预定义状态的自定义 Quick QML 项目

Qt Quick 多媒体 - 播放音乐和视频