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

时间:2017-01-17 13:53:06

标签: qt qml

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

Rectangle { width: 100; height: 100 }

然后我通过QObject *root = view->rootObject()检索根对象。 现在我想从这个对象中获取类名。 以下代码导致“QQuickRectangle”

root->metaObject()->className()

但我想要的是“Rectangle”,就像qml文件中的typename一样。 有什么想法吗?

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

enter image description here

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

有更好的"保留在此信息上的信息(QQmlType& QQmlMetaType),但无法通过我能想到的任何公共API访问。

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

答案 2 :(得分:0)

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

Rectangle {
    objectName: "Rectangle"
}

所以:

QString className = item->objectName();