天天看點

QMetaEnum擷取枚舉元資訊

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)注釋掉,代碼仍可以争取運作,大家可以自行測試即可。

---------------------

作者:求道玉