zoukankan      html  css  js  c++  java
  • 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)类型值及字符串转换
  • 相关阅读:
    学习Vue CLI 3.x版本的安装以及创建项目
    Java中同一线程中的对象hashcode一样
    Java中线程范围内共享问题
    Java中的线程池模拟
    java中的Switch
    string、stringbuffer、stringbuild的时间性能对比
    Java中lock上锁 unlock解锁
    java中的三目运算
    Java中的Instanceof
    一个简单的for循环
  • 原文地址:https://www.cnblogs.com/techiel/p/8023333.html
Copyright © 2011-2022 走看看