在QML中,如何通过反射查询项的属性类型?
即我有一个项目C
,其属性为x
,类型为real
,属性为y
,类型为string
:在其他某个呼叫站点,我有一个C
的实例,并想查询其属性x
的类型。使用普通Qt,我可以使用QMetaObject
,但是如何使用QML做到这一点?
答案 0 :(得分:3)
与JavaScript一样,您可以使用typeof
:
QtObject {
id: c
property real x
property string y
property int z
Component.onCompleted: print(typeof c.x, typeof c.y, typeof c.z)
}
这将打印qml: number string number
。
请注意,x
和z
之间虽然没有相同的类型,但没有区别,这是因为JavaScript只能识别一种数字类型,每个数字都是64位浮点数*。
如果您想知道Qt引擎实际上是如何存储类型的,则必须按照问题中的说明进行操作,请使用QMetaObject。 为此,您可以将c ++类型公开为qml singleton,并在其中公开一个可调用的方法,以返回对象属性的类型名:
#ifndef METAOBJECTHELPER_H
#define METAOBJECTHELPER_H
#include <QMetaObject>
#include <QObject>
#include <QQmlProperty>
class MetaObjectHelper : public QObject {
Q_OBJECT
public:
using QObject::QObject;
Q_INVOKABLE QString typeName(QObject* object, const QString& property) const
{
QQmlProperty qmlProperty(object, property);
QMetaProperty metaProperty = qmlProperty.property();
return metaProperty.typeName();
}
};
#endif // METAOBJECTHELPER_H
在QML中执行此操作:
print(MetaObjectHelper.typeName(c, "x"), MetaObjectHelper.typeName(c, "y"), MetaObjectHelper.typeName(c, "z"));
然后将打印qml: double QString int
*:更细微的细节here