首页 > 解决方案 > QML:反射访问属性类型

问题描述

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

即我有一个C具有xtypereal属性y和 type属性的 Item string;在其他一些呼叫站点,我有一个实例C并且想要查询其属性的类型x。使用普通的 Qt,我可以使用QMetaObject,但是如何使用 QML 做同样的事情?

标签: qtqml

解决方案


与 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 单例,并在其中公开一个可调用的方法,返回对象属性的类型名:

#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

* : 更多细节在这里


推荐阅读