如何获取解析 QML 的 QObject 实例的类型名?

问题描述 投票:0回答:4

我有一个 QQuickView,它加载了如下所示的 qml 文件。

Rectangle { width: 100; height: 100 }

然后我通过

QObject *root = view->rootObject()
检索根对象。 现在我想从这个对象中获取类名。 以下代码结果为“QQuickRectangle”

root->metaObject()->className()

但我想要的是“矩形”,就像 qml 文件中的类型名一样。 有什么想法吗?

编辑:我想使用像 QtCreator 这样的 qml 文件的对象层次结构构建一个树视图。

enter image description here

qt qml
4个回答
2
投票

有一个模式,对于在 C++ 中实现的 qml 类型,名称为

QQuickSomething
,对于在 qml 中实现的 qml 类型,名称为
Something_QMLTYPE_X_MAYBEMORESTUFF(objAddress)

因此,您可以根据隔离实际类型名称的结果进行一些基本的字符串编辑:

QString name = QString(root->metaObject()->className());
if (name.contains("QQuick")) name.remove("QQuick");
else if (name.contains("QMLTYPE")) name.remove(QRegExp("_QMLTYPE_[0-9]*.*"));
// else it might be just a QObject or your on custom type you should handle

编辑:我想用 qml 的对象 hirarchie 构建一个树视图 像 QtCreator 这样的文件。

除非您愿意深入研究并使用私有 API,否则拥有自己的自定义模型来驱动视图和实际对象树可能会更容易且更有用。另外,QML 很容易解析,我个人会全力以赴,比我进入现有解析更快地编写解析,特别是如果需要的只是一个对象树轮廓,但是 YMMV。


2
投票

有关于此的“更好”信息(

QQmlType
QQmlMetaType
),但无法通过我能想到的任何公共API访问。

你能解释一下你想用它做什么吗?也许还有其他选择。


0
投票

QtQuick 不为 QML 项目提供一些特殊的元数据。看起来 QtQuick 仅在解析源时在内部使用项目类型。 已知的解决方法是

objectName
:

Rectangle {
    objectName: "Rectangle"
}

所以:

QString className = item->objectName();

0
投票

是的,针对特定情况有一个答案。

您可以获得 QML 类型名称,例如 Item、Rectangle 或 MyItem

我需要通过 JavaScript 获取 QML 名称,无论是矩形还是新组件 MyButton : MouseArea {...} 的名称

够了

let name = object.toString()
let typename = name.substring(0, name.length-15)

您可能会发现直接在 QML 中处理此问题很方便,但 C++ 中有多种选择:从评估 JS,到使用 MOC 或任何代表 QQuickRectangle(0x1a45f97bdd0) 形式的名称的类。 您需要从末尾删除 15 位数字

不幸的是,对于我的情况,不需要在 C++ 中重复此功能, 这就是它在 QML 中派上用场的地方

Item{
    id: lets_enum_children_types
    Rectangle{
        x: 0
        y: 0
        //...
    }

    component MyButton: MouseArea{
        //...
    }

    MyButton{
        //...
    }

    TextEdit{
        //...
    }

    Button{

    }

    ////////////////

    function dump(object) {
        console.log("dump")


        for (const i in object.children){
            let name =  object.children[i].toString()
            let typename = name.substring(0, name.length-15)
            console.log( typename )
        }
    }

    Component.onCompleted: dump(lets_enum_children_types)

    ////////////////

    qml: dump
    qml:      QQuickRectangle
    qml:      MyButton
    qml:      QQuickTextEdit
    qml:      Button_QMLTYPE_26

}

关于自定义组件的名称完全匹配,但库组件不匹配的事实

  • 库组件不是纯 QML,需要匹配名称或需要用纯 QML 类型替换库类型
© www.soinside.com 2019 - 2024. All rights reserved.