版权声明:若无来源注明,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. return 0;
  23. }

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

QMetaEnum不光实现了枚举值和字符串的映射关系,额应该是key和value的映射关系,key 就是数字12345……,value就是枚举定义里面的字符串。同时还提供了枚举名称、枚举类型所属类、枚举项数量的函数,使用很方便。

转载请以链接形式标明本文标题和地址:Techie亮博客 » QMetaEnum利用Qt元数据实现枚举(enum)类型值及字符串转换

QMetaEnum利用Qt元数据实现枚举(enum)类型值及字符串转换的更多相关文章

  1. 24 枚举Enum类

    引用声明:部分内容来自文章:http://c.biancheng.net/view/1100.html 枚举Enum类是java.lang下的一个类. 枚举的命名规范 枚举名:大驼峰 枚举值:全大写, ...

  2. python 枚举Enum类的使用

    1. 枚举的定义 首先,定义枚举要导入enum模块. 枚举定义用class关键字,继承Enum类. 示例代码: from enum import Enum class Color(Enum): red ...

  3. Qt and C++ Reflection,利用Qt简化C++的反射实现

    如何在C++中实现反射机制,应该算是C++开发中经常遇到的问题之一.C++程序没有完整的元数据,也就无法实现原生的反射机制.从性能的角度讲,这样的设计不难理解,毕竟在运行时储存这些元数据需要额外的开销 ...

  4. 枚举基类Enum详解

    本文主要是对枚举类型的基类Enum类做一个介绍: 首先,Enum类位于java.lang包下,根据类的介绍可以发现,Enum类是Java中所有枚举类的父类,将枚举作为一个set或者Map的keys来使 ...

  5. java:常用类(包装类,equals和==的比较,Date,java.lang.String中常用方法,枚举enum)

    *包装类: 将基本类型封装成类,其中包含属性和方法以方便对象操作. *byte---->Byte *short--->Short *long--->Long *float---> ...

  6. 【翻译】利用Qt设计师窗体在运行时创建用户界面(Creating a user interface from a Qt Designer form at run-time)

    利用Qt设计师窗体在运行时创建用户界面 我们利用Calculator窗体例子中创建的窗体(Form)来展示当一个应用(application)已经生成后,是可以在其运行时产生与例子中相同的用户界面. ...

  7. 【转】结构struct 联合Union和枚举Enum的细节讨论

    结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...

  8. Mybatis中使用自定义的类型处理器处理枚举enum类型

    知识点:在使用Mybatis的框架中,使用自定义的类型处理器处理枚举enum类型 应用:利用枚举类,处理字段有限,可以用状态码,代替的字段,本实例,给员工状态字段设置了一个枚举类 状态码,直接赋值给对 ...

  9. java enum类探索

    参考网址1, 参考网址2 一直对枚举有点迷惑,现在试着理解枚举. 1.首先,普通类与枚举 的区别.拿两个例子比较吧 普通类: /** * 一个普通类 * @author Administrator * ...

随机推荐

  1. SELinux初学者指南

    SELinux(Security Enhanced Linux)是美国国家安全局2000年发布的一种高级MAC(Mandatory Access Control,强制访问控制)机制,用来预防恶意入侵. ...

  2. svn文件管理

    将VS2010工程提交给Git管理时需要哪些文件:    *.h  *.cpp  *.sln  *.vcxproj  *.vcxproj.filters  *.qrc以及Resources目录下的资源 ...

  3. Angular 7 版本

    Angular 7 版本 这是跨整个平台的主要版本,更新包括核心框架,Angular Material和CLI. 如何更新到v7 可以访问update.angular.io以获取有关更新应用程序的详细 ...

  4. 自己用原生JS写的轮播图,支持移动端触摸滑动,分页器圆点可以支持mouseover鼠标移入和click点击,高手看了勿喷哈

    自己用原生JavaScript写的轮播图,分页器圆点按钮可支持click点击,也可支持mouseover鼠标悬浮触发,同时支持移动端触摸滑动,有兴趣的友友可以试试哈,菜鸟一枚,高手看了勿喷,请多多指正 ...

  5. 20155216 2016-2017-2 《Java程序设计》第二周学习总结

    教材学习内容总结 类型 short占2字节 int占4字节 long占8字节 byte占1字节,可表示-128~127的整数 char占2字节 boolean不考虑占字节 float占4字节 doub ...

  6. 20155310 2016-2017-2 《Java程序设计》第四周学习总结

    20155310 2016-2017-2 <Java程序设计>第四周学习总结 一周两章新知识的自学与理解真的是很考验和锻炼我们,也对前面几章我们的学习进行了检测,遇到忘记和不懂的知识就再复 ...

  7. 20155316 2016-2017-2 《Java程序设计》第3周学习总结

    教材学习内容总结 类:创建类.使用类 基本类类型与类类型 数组 封装的概念 重载 类语法 static成员 教材学习中的问题和解决过程 1.既然数组在JAVA中就是对象,那么int[] 是否是一个类呢 ...

  8. 嵌入式C语言——提取时分秒

    嵌入式C语言--提取时分秒 题目: 相关知识点 提取位: 插入位 用宏定义定义地址 #define TIME_Addr 0xFFFFC0000 #define TIME *(volatile int ...

  9. 使用cursor递归遍历sqlserver的相应表

    use rc GO )DECLARE cur1 cursor for select [name] from sys.tables where name LIKE 'index_%' drop tabl ...

  10. eclipse 打包maven项目的坑

    一.问题: 公司开发了一个项目,需要作为后台服务运行,整个项目的构成是:[maven + spring + eclipse] 在使用打包的时候遇到许多问题: (1)eclipse中maven工具的集成 ...