QMetaEnum利用Qt元数据实现枚举(enum)类型值及字符串转换
本文标题:QMetaEnum利用Qt元数据实现枚举(enum)类型值及字符串转换 本文地址:http://techieliang.com/2017/12/622/
1. 介绍
QMetaEnum类属于Qt core模块,提供了一系列针对枚举类型的操作函数,当然不能操作任意枚举类型,若想进行自定义枚举的操作,首先需要对枚举做处理,此时需要QObject类的帮助,使用此类提供的Q_ENUM模板。
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)即可。
Qt自身的枚举类型都不需要此操作,可以直接使用。
- 必须有Q_OBJECT? 不能只继承自QObject
- Q_ENUM和Q_OBJECT都不要加分号,强迫症会出错
- 很遗憾不能将枚举类型直接放置在全局域
疑惑:这个类必须在单独的文件?直接放到main.cpp中一直报错,具体原因没有详细研究
3. QMetaEnum使用
Qt自身的枚举都可以直接使用。
- #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 类文件
QMetaEnum不光实现了枚举值和字符串的映射关系,额应该是key和value的映射关系,key 就是数字12345……,value就是枚举定义里面的字符串。同时还提供了枚举名称、枚举类型所属类、枚举项数量的函数,使用很方便。
QMetaEnum利用Qt元数据实现枚举(enum)类型值及字符串转换的更多相关文章
- 24 枚举Enum类
引用声明:部分内容来自文章:http://c.biancheng.net/view/1100.html 枚举Enum类是java.lang下的一个类. 枚举的命名规范 枚举名:大驼峰 枚举值:全大写, ...
- python 枚举Enum类的使用
1. 枚举的定义 首先,定义枚举要导入enum模块. 枚举定义用class关键字,继承Enum类. 示例代码: from enum import Enum class Color(Enum): red ...
- Qt and C++ Reflection,利用Qt简化C++的反射实现
如何在C++中实现反射机制,应该算是C++开发中经常遇到的问题之一.C++程序没有完整的元数据,也就无法实现原生的反射机制.从性能的角度讲,这样的设计不难理解,毕竟在运行时储存这些元数据需要额外的开销 ...
- 枚举基类Enum详解
本文主要是对枚举类型的基类Enum类做一个介绍: 首先,Enum类位于java.lang包下,根据类的介绍可以发现,Enum类是Java中所有枚举类的父类,将枚举作为一个set或者Map的keys来使 ...
- java:常用类(包装类,equals和==的比较,Date,java.lang.String中常用方法,枚举enum)
*包装类: 将基本类型封装成类,其中包含属性和方法以方便对象操作. *byte---->Byte *short--->Short *long--->Long *float---> ...
- 【翻译】利用Qt设计师窗体在运行时创建用户界面(Creating a user interface from a Qt Designer form at run-time)
利用Qt设计师窗体在运行时创建用户界面 我们利用Calculator窗体例子中创建的窗体(Form)来展示当一个应用(application)已经生成后,是可以在其运行时产生与例子中相同的用户界面. ...
- 【转】结构struct 联合Union和枚举Enum的细节讨论
结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...
- Mybatis中使用自定义的类型处理器处理枚举enum类型
知识点:在使用Mybatis的框架中,使用自定义的类型处理器处理枚举enum类型 应用:利用枚举类,处理字段有限,可以用状态码,代替的字段,本实例,给员工状态字段设置了一个枚举类 状态码,直接赋值给对 ...
- java enum类探索
参考网址1, 参考网址2 一直对枚举有点迷惑,现在试着理解枚举. 1.首先,普通类与枚举 的区别.拿两个例子比较吧 普通类: /** * 一个普通类 * @author Administrator * ...
随机推荐
- STL的六大容器之iterator----自定义范式
STL的iterator组件,分离了容器和算法. 一.规定 在STL体系下定义iterator,要满足规定的一些规范: 1.iterator_category 有5中分类,决定胃具体的操作,如:++, ...
- golang 错误处理与异常
原文地址 golang 中的错误处理的哲学和 C 语言一样,函数通过返回错误类型(error)或者 bool 类型(不需要区分多种错误状态时)表明函数的执行结果,调用检查返回的错误类型值是否是 nil ...
- spark 例子倒排索引
spark 例子倒排索引 例子描述: [倒排索引(InvertedIndex)] 这个例子是在一本讲spark书中看到的,但是样例代码写的太java化,没有函数式编程风格,于是问了些高手,教我写了份函 ...
- 重学Veriliog(2)——高级编程语句
1.判断 1.1 if ... else ... 有优先级 在组合逻辑电路中,需要避免产生Latch(避免结构不完整) Latch容易引起竞争冒险,同时静态时序分析工具也不好分析穿过Latch的路径? ...
- 20155236 2016-2017-2 《Java程序设计》第一周学习总结
20155236 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 第一章:java平台概论 java SE(j2SE)分为四个主要的部分:JVM.JRE.JD ...
- 2017-2018-1 20155308《信息安全技术》实验二——Windows口令破解
2017-2018-1 20155308<信息安全技术>实验二--Windows口令破解 实验原理 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理员的了解,猜测 ...
- javaweb(二十四)——jsp传统标签开发
一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...
- 用php做个简单的日历
存档: index.php <html> <head> <title>日历</title> <style> table{border:1px ...
- python全栈开发-面向对象-进阶2
python_day_19 今日主要内容: 1.抽象类,接口类 2.多态 3.封装 1.抽象类,接口类 python 没有接口这个概念接口类,抽象类: 制定一个规范. 举个栗子:你的项目经理提一个需求 ...
- html表单总结
总结了下html表单: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...