簡體   English   中英

QML:以反射方式訪問屬性類型

[英]QML: reflective access to type of property

在QML中,如何通過反射查詢項的屬性類型?

即我有一個Item C ,它的屬性xreal類型,屬性ystring ; 在其他某個呼叫站點,我有C的實例,並想查詢其屬性x的類型。 使用普通Qt,我可以使用QMetaObject ,但是如何使用QML呢?

與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只能識別1個數字類型,每個數字都是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

*:更多細節在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM