1. 介紹
QMetaEnum類屬於Qt core模塊,提供了一系列針對枚舉類型的操做函數,固然不能操做任意枚舉類型,若想進行自定義枚舉的操做,首先須要對枚舉作處理,此時須要QObject類的幫助,使用此類提供的Q_ENUM模板。html
詳細信息請見官方文檔:QObject、QMetaEnumc++
2. 自定義枚舉類型
- #include <QObject>
- class TestClass : public QObject {
- Q_OBJECT //必須有
- public:
- enum TestEnum {
- one = 0,
- two,
- three
- };
- Q_ENUM(TestEnum)
- };
枚舉類型的聲明與c++標準相同,只不過須要將枚舉放置在一個繼承自QObject的子類中,同時要使用Q_OBJECT模板,在枚舉聲明後面添加Q_ENUM(enum_name)便可。app
Qt自身的枚舉類型都不須要此操做,能夠直接使用。函數
- 必須有Q_OBJECT? 不能只繼承自QObject
- Q_ENUM和Q_OBJECT都不要加分號,強迫症會出錯
- 很遺憾不能將枚舉類型直接放置在全局域
疑惑:這個類必須在單獨的文件?直接放到main.cpp中一直報錯,具體緣由沒有詳細研究post
3. QMetaEnum使用
Qt自身的枚舉均可以直接使用。spa
- #include <QCoreApplication>
- #include <QDebug>
- #include <QMetaEnum>
- #include <QObject>
- #include "testclass.h"
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- QMetaEnum tenum = QMetaEnum::fromType<TestClass::TestEnum>();
- qDebug() << tenum.isValid();//判斷是否有效
- qDebug() << tenum.name();//枚舉名字
- qDebug() << tenum.scope();//範圍
- //獲取枚舉數量,根據序號獲取字符串
- for(int i = 0; i < tenum.keyCount(); i++)
- qDebug() << tenum.key(i);
- //根據字符串獲取值
- qDebug() << tenum.keyToValue("two");
- //根據值獲取字符串
- qDebug() << tenum.valueToKey(2);
- //根據序號獲取值
- for(int i = 0; i < tenum.keyCount(); i++)
- qDebug() << tenum.value(i);
-
- return 0;
- }
testclass.h就是上面的TestClass 類文件htm
QMetaEnum不光實現了枚舉值和字符串的映射關係,額應該是key和value的映射關係,key 就是數字12345……,value就是枚舉定義裏面的字符串。同時還提供了枚舉名稱、枚舉類型所屬類、枚舉項數量的函數,使用很方便。繼承