QMetaEnum利用Qt元數據實現枚舉(enum)類型值及字符串轉換


博客地址已更改,文章數量較多不便批量修改,若想訪問源文請到 coologic博客 查閱,網址:www.coologic.cn

如本文記錄地址為 techieliang.com/A/B/C/ 請改為 www.coologic.cn/A/B/C/ 即可查閱

 

版權聲明:若無來源注明, Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址:
本文標題:QMetaEnum利用Qt元數據實現枚舉(enum)類型值及字符串轉換     本文地址: http://techieliang.com/2017/12/622/

1. 介紹

QMetaEnum類屬於Qt core模塊,提供了一系列針對枚舉類型的操作函數,當然不能操作任意枚舉類型,若想進行自定義枚舉的操作,首先需要對枚舉做處理,此時需要QObject類的幫助,使用此類提供的Q_ENUM模板。

詳細信息請見官方文檔:QObjectQMetaEnum

2. 自定義枚舉類型

  1. #include <QObject>
  2. class TestClass : public QObject {
  3. Q_OBJECT //必須有
  4. public:
  5. enum TestEnum {
  6. one = 0,
  7. two,
  8. three
  9. };
  10. Q_ENUM(TestEnum)
  11. };

枚舉類型的聲明與c++標准相同,只不過需要將枚舉放置在一個繼承自QObject的子類中,同時要使用Q_OBJECT模板,在枚舉聲明后面添加Q_ENUM(enum_name)即可。

Qt自身的枚舉類型都不需要此操作,可以直接使用。

  • 必須有Q_OBJECT? 不能只繼承自QObject
  • Q_ENUM和Q_OBJECT都不要加分號,強迫症會出錯
  • 很遺憾不能將枚舉類型直接放置在全局域

疑惑:這個類必須在單獨的文件?直接放到main.cpp中一直報錯,具體原因沒有詳細研究

3. QMetaEnum使用

Qt自身的枚舉都可以直接使用。

  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include <QMetaEnum>
  4. #include <QObject>
  5. #include "testclass.h"
  6. int main(int argc, char *argv[]) {
  7. QCoreApplication a(argc, argv);
  8. QMetaEnum tenum = QMetaEnum::fromType<TestClass::TestEnum>();
  9. qDebug() << tenum.isValid();//判斷是否有效
  10. qDebug() << tenum.name();//枚舉名字
  11. qDebug() << tenum.scope();//范圍
  12. //獲取枚舉數量,根據序號獲取字符串
  13. for(int i = 0; i < tenum.keyCount(); i++)
  14. qDebug() << tenum.key(i);
  15. //根據字符串獲取值
  16. qDebug() << tenum.keyToValue("two");
  17. //根據值獲取字符串
  18. qDebug() << tenum.valueToKey(2);
  19. //根據序號獲取值
  20. for(int i = 0; i < tenum.keyCount(); i++)
  21. qDebug() << tenum.value(i);
  22.  
  23. return 0;
  24. }

testclass.h就是上面的TestClass 類文件

QMetaEnum不光實現了枚舉值和字符串的映射關系,額應該是key和value的映射關系,key 就是數字12345……,value就是枚舉定義里面的字符串。同時還提供了枚舉名稱、枚舉類型所屬類、枚舉項數量的函數,使用很方便。

轉載請以鏈接形式標明本文標題和地址: Techie亮博客 » QMetaEnum利用Qt元數據實現枚舉(enum)類型值及字符串轉換


免責聲明!

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



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