[英]Printing a Qt property enum value as a key string
我有一個QML Loader
,在某些情況下我想打印它的status
屬性,但是即使使用toString()
,我在控制台上也得到0
。 因此,我需要始終參考qquickloader_p.h中的枚舉值的順序以了解發生了什么。
還有其他方法嗎?
如果以下語法適合您的需要,實際上有一種方法可以獲取枚舉鍵,而無需知道甚至不傳遞枚舉名稱:
Info.print(loader, "status")
您可以通過以下方式獲取它:
#include <QMetaType>
#include <QMetaProperty>
#include <QMetaEnum>
#include <QObject>
#include <QDebug>
class EnumInfo : public QObject {
Q_OBJECT
public slots:
void print(QObject * obj, QString prop) {
const QMetaObject * meta = obj->metaObject();
int i = meta->indexOfProperty(qUtf8Printable(prop));
if (i > -1) {
QMetaProperty p = meta->property(i);
if (p.isEnumType()) {
QMetaEnum en = p.enumerator();
qDebug() << en.name() << ":" << en.key(obj->property(p.name()).toInt());
}
}
}
};
該對象最好以單例形式暴露給QML,盡管對於更隨意的使用,上下文屬性不會帶來太多開銷。
唯一的其他方法是從C ++幫助器訪問該屬性,該幫助器使用moc生成的元數據查找枚舉的名稱。 另請參閱此答案 。
與使用整數相比,使用ENUM可使代碼更具可讀性,但比使用字符串更快。
他們的意圖主要是比較。
如果要使用名稱,則需要創建其他結構(例如數組)來查找它們。 通常,這不是必需的,因此效率更高,而不是這樣做。
如果查看console.log(typeof(Loader.Ready))
您會發現ENUM
確實不過是一個number
-也許還有一些元對象信息。
由於使用MetaObject,即使不舒服,也有一種方法...問題是,您需要知道ENUM
的名稱
enumspy.h
#ifndef ENUMSPY_H
#define ENUMSPY_H
#include <QObject>
class EnumSpy: public QObject
{
Q_OBJECT
public:
EnumSpy(QObject* parent = nullptr);
public slots:
QString getEnumName(QObject* object, QString name, int index) const;
};
#endif // ENUMSPY_H
enumspy.cpp
#include <QMetaObject>
#include <QMetaEnum>
#include <QDebug>
#include "enumspy.h"
EnumSpy::EnumSpy(QObject* parent)
: QObject(parent)
{
}
QString EnumSpy::getEnumName(QObject *object, QString name, int index) const
{
const QMetaObject* meta = object->metaObject();
QMetaEnum enm = meta->enumerator(meta->indexOfEnumerator(&name.toStdString()[0]));
qDebug() << meta;
return QString(enm.key(index));
}
注冊它,創建一個對象,然后調用該方法。
注意:加載程序的ENUM的名稱為
Status
myEnumSpy.getEnumName(myLoaderInstance, 'Status', 1) => "Ready"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.