QMetaEnum 類提供了一個枚舉的中繼資料。我們可以使用該類的靜态模闆函數,fromType<enumerator>來獲得關于某個枚舉的QMetaEnum對象,然後就可以調用該類的成員函數來獲得該枚舉的相關資訊。該枚舉必須使用Q_ENUM宏進行聲明。
我們可以使用name()函數來獲得枚舉的名字;使用key()函數獲得枚舉的鍵,即每個枚舉項的名字;使用keyCount()函數得到鍵的個數。
isFlag()函數可以用來判斷該枚舉是否可以作為flag使用,即每一個枚舉項是否可以使用OR操作符進行運算。
keyToValue(),valueToKey(),keysToValue()和valueToKeys()函數,可以用來在枚舉項的整數表示和字元串表示之間進行轉換。
scope()函數可以傳回該枚舉作用域的類名,即給枚舉所在的類。
下面,我們通過一個例子,簡單的使用一下該類的每一個成員函數。代碼如下:
我們先聲明一個QObject的子類,在該類中定義一個枚舉類型:
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = 0);
~MyClass(){}
enum Priority { High, Low, VeryHigh, VeryLow };
Q_ENUM(Priority)
};
#endif // MYCLASS_H
然後在main函數,使用QMetaEnum列印出該枚舉的詳細資訊:
#include <QCoreApplication>
#include <QMetaEnum>
#include <QDebug>
#include "myclass.h"
int main(int argc, char *argv[])
QCoreApplication a(argc, argv);
QMetaEnum me = QMetaEnum::fromType<MyClass::Priority>();
qDebug() << me.isFlag();
qDebug() << me.isValid();
for(int i = 0; i < me.keyCount(); i++)
qDebug() << me.key(i);
qDebug() << me.keyToValue("High");
qDebug() << me.name();
qDebug() << me.scope();
qDebug() << me.value(i);
qDebug() << me.valueToKey(2);
return a.exec();
}
運作結果如下:
由輸出結果可以看到,由于我們沒有将枚舉聲明為flag,是以isFlag()函數傳回false。
如果我們在Q_ENUM(Property)下面添加下面在兩句代碼:
Q_DECLARE_FLAGS(Priorities, Priority)
Q_FLAG(Priorities)
再講main函數中fromType()函數的調用修改如下:
QMetaEnum me = QMetaEnum::fromType<MyClass::Priorities>();
再運作程式,結果如下:
可以看到,此時isFlag()函數就傳回了true,并且對其他函數的調用并不受影響。這是因為,Q_FLAG宏會向Qt元對象系統注冊每一個枚舉項。也就是說,使用了Q_FLAG,就不必再使用Q_ENUM宏了。是以,将Q_ENUM(property)注釋掉,代碼仍可以争取運作,大家可以自行測試即可。
---------------------
作者:求道玉