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();
for(int i = 0; i < me.keyCount(); i++)
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)注釋掉,代碼仍可以爭取運行,大家可以自行測試即可。
---------------------
作者:求道玉
來源:CSDN
原文:https://blog.csdn.net/Amnes1a/article/details/69089469
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM