Qt 如何获取解析QML的QObject实例的typename?
我有一个QQuickView,它加载了一个qml文件,如下所示Qt 如何获取解析QML的QObject实例的typename?,qt,qml,Qt,Qml,我有一个QQuickView,它加载了一个qml文件,如下所示 Rectangle { width: 100; height: 100 } 然后我通过QObject*root=view->rootObject()检索根对象。 现在我想从这个对象中获取类名。 以下代码生成“QQuickRectangle” 但是我想要的是“矩形”,就像qml文件中的typename一样。 有什么想法吗 编辑:我想用QtCreator之类的qml文件的对象hirachie构建一个treeview QtQuick不为
Rectangle { width: 100; height: 100 }
然后我通过QObject*root=view->rootObject()
检索根对象。
现在我想从这个对象中获取类名。
以下代码生成“QQuickRectangle”
但是我想要的是“矩形”,就像qml文件中的typename一样。
有什么想法吗
编辑:我想用QtCreator之类的qml文件的对象hirachie构建一个treeview
QtQuick不为QML项提供某些特殊元数据。看起来QtQuick仅在解析源时在内部使用项类型。 已知的解决方法是
objectName
:
Rectangle {
objectName: "Rectangle"
}
因此:
QString className = item->objectName();
有一种模式,对于C++中实现的QML类型,名称将是“代码> QQuasthOuts<代码>,对于QML中实现的QML类型,名称将是代码>某个短语,qMyType x xMyBeMeReSufff(ObjAdvices)< /C> 因此,您可以根据得到的结果进行一些基本的字符串编辑,以隔离实际的类型名称:
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的hirache对象构建一个树视图
像QtCreator一样的文件
除非您愿意深入研究并使用私有API,否则拥有自己的自定义模型来驱动视图和实际的对象树可能会更容易,也更有用。此外,QML很容易解析,我个人会全力以赴,写一篇解析文章,速度比进入现有的要快,特别是如果只需要一个对象树大纲,但是YMMV。这方面有“更好”的信息(QQmlType
&QQmlMetaType
),但我想不出通过任何公共API都可以访问它
你能解释一下你想用它做什么吗?也许还有其他选择。你确定吗
console.log(someObj)
显示为其他指示。“代码> > ObjtNeX//CODE”在“代码”> QObjult/Cl>中一直被实现,因此它可以直接访问,而不是慢得多的字符串查找属性加上变量转换。是的,QQuickRectangle
,与metaObject()->className()
完全相同。对于QML定义的类型,您无法获取QML类型名称,例如Item
、Rectangle
或MyItem
,对于我的T_Root.qml
类型,控制台输出显示T_Root\u QMLTYPE_18
,因此显然有qml类型信息。我正在开发一个qml设计器应用程序,我想填充一个树视图,就像来自QtCreator的导航器一样。也许有一个qml解析器在那里?QtQuick自己的解析器在。从我的记忆中,我认为造物主使用了一个复制品,它是为自己而改编的——但我对造物主了解不多,所以我可能是错的。.g文件可能是查看“规则”的良好起点。如果我有自定义QML类型,例如Test.QML
其中Item
是根项,console.log()
将其打印为QML:QQuickItem(0x2a63b050)
而不是Test\u QMLTYPE\u X
,因此在这种情况下我会丢失该类型。用Qt5.7.0、MIWW进行测试。C++类名和QML类型名称不需要任何关系。code>qmlRegisterType()将任意字符串(只要它是有效的类型名)作为其第四个字符串argument@folibis-这很奇怪,对我来说,它总是打印QMLTYPE,而不管根项是什么以及它是如何实现的。@kevinkramer-这是真的,但是库存qml类型遵循相同的约定。我看不出有什么好的理由不为你自己的类型遵循它。如果没有一个直接访问qml元数据的公共api,那么您似乎就没有什么其他可以做的了。这是Qt在我看来很糟糕的一点——太多重要的东西要么是私有的,要么是硬编码的,要么是完全丢失的。对了,你可以有自己的类命名方案,并在QQuick
使用的方案之外检查它。但这只解决了您的类和QQuick
类,而不是任何第三方的问题。
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