QML:以反射方式访问属性类型

时间:2018-10-19 07:19:23

标签: qt qml

在QML中,如何通过反射查询项的属性类型?

即我有一个项目C,其属性为x,类型为real,属性为y,类型为string:在其他某个呼叫站点,我有一个C的实例,并想查询其属性x的类型。使用普通Qt,我可以使用QMetaObject,但是如何使用QML做到这一点?

1 个答案:

答案 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

请注意,xz之间虽然没有相同的类型,但没有区别,这是因为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