QMetaEnum: C++ 中将枚举值自动转换为字符串

c++中的enum类型 C++允许程序员创建自己的数据类型,比如本节要将的枚举类型。枚举数据类型是一种由程序员定义的数据类型,其合法是与它们关联的一组命名整数常量。 之所以被称为枚举类型,就是因为命名常量是作为数据类型定义的一部分而枚举或列出的,以下是枚举类型声明的示例: enum Roster {Tom, Sharon, Bill, Teresa, John}; 该语句将创建一个名为 Roster 的数据类型。... 阅读详情

当我们需要在日志中输出枚举类型的信息时,如果只记录一个数字,查看日志时就需要再去查找这个枚举值的意思,不直观,不方便,我们会希望可以直接输出这个枚举值对应的字符串。比如下面这个枚举 Color,我们该如何将枚举值 Red 转化为字符串 “Red”?

enum Color{ Red, Orange, Yellow, green };

# 运算符

一种最直接的方法是:使用 map 或者 list 之类的容器做一个映射。还有一个更简单的做法,我们可以借助宏 (macro) 的 # 运算符 (Stringification Operator),该运算符在预编译阶段会将宏参数转换为字符串。

#define str(val) #val

int main(int argc, char *argv[])
{
    printf("Value %d in the enum Color is %s\n", Red, str(Red));
}

输出:Value 1 in the enum Color is Red

不幸的是,上诉方式只对直接操作枚举值有效,不适用于变量,比如:

Color cc = Red;

如果使用上述办法,我们将得到:Value 0 in the enum Color is cc。那么我们该怎么得到 cc 对应的枚举值字符串?

方法有很多,可以映射,可以使用更复杂的宏(类似 boost::preprocessor)等等,有兴趣可以尝试。这里重点介绍利用 Qt 的元对象系统实现这个功能。

QMetaEnum 类提供了有关枚举的元数据,而 Q_ENUM 宏可以在元对象系统中注册了一个枚举类型的 QMetaEnum,它必须用在具有 Q_OBJECT 或 Q_GADGET 宏的类中的枚举声明之后。

QMetaEnum 类

name() 返回枚举的名称,scope() 返回声明枚举的类作用域。

key() 返回每个枚举项的名称,value() 返回每个枚举项的值,keyCount() 返回枚举项的数量。

isFlag() 表示该枚举是否打算用作标志,若为 true,意味着可以使用 OR 运算符组合各个枚举值。

keyToValue()、valueToKey() 为转换函数,允许枚举项在名称和值之间转换。
keysToValue() 和 valueToKeys() 对 isFlag() 的枚举提供名称和值的转换,键中字符串以“|”分隔。

详见 Qt 文档:QMetaEnum Class | Qt Core

class MyClass : public QObject
{
    Q_OBJECT
public:
    explicit MyClass
enum_strings:c ++ enum可转换为和从字符串 枚举字符串 C++ 枚举可与字符串相互转换。 源代码是从几个来源收集的,并稍作修改。 代码中引用了原始来源。 例子 # include " enum_conversions_macro.h " ENUM_CLASS (Day, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); int main () { // get enum size std::cout << " enum size: " << EnumManager>:: size () << std xss=removed xss=removed>:: toString (e); std::co 立即下载

相关推荐

C/C++ 枚举字符串

枚举字符串 [TOC] 1.开篇   在代码调试时,我们经常需要直观地定位当前枚举变量为哪个枚举常量。通常通过打印枚举就可以确定,但是当枚举常量表过多时,就不那么直观了。本篇记录一种C/C++枚举变量字符串的实用技巧。 2.实现原理   在学习C语言宏的时候,有看到 “#” 在宏(#define)中有一些特殊的用法,这里先回顾一下: #: 预处理阶段,将宏参数化为字符串 ##: 预处理阶...

LinuxTaoist的博客 4029

C++自定义的枚举类型(enum)和字符串相互转换

在使用上非常简洁的实现C++的enum(枚举类型)和string相互转换,定义和使用过程和enum几乎一样,但可以实现enum和string相互转换

ST_stone的博客 1万+

C/C++枚举字符串的技巧

在C、C++中经常需要定义枚举,或根据枚举来获取对应的枚举字符串,以下示例巧妙的利用宏的特性来实现,请参考。

halazi100 1万+

QMetaEnum类获取枚举信息

Qt中可以获取枚举变量的枚举枚举字符串枚举数量等相关信息。 效果图及示例代码 头文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: enu...

浮生流年的博客 1660

【建议收藏】QT实现字符串枚举的相互转换,从源码角度分析实现原理

QT中实现字符串枚举转换主要是利用Qt的元对象机制。类必须继承于QObject并使用Q_OBJECT宏;类内添加枚举,使用Q_ENUM宏将枚举注册到元对象系统中;

q2nAmor 2454

QtQMetaEnum

QMetaEnum类提供有关枚举器的元数据。 头文件: #include <QMetaEnum> cmake: find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) qmake: QT += core 详细说明 使用name()作为枚举器的名称。枚举器的键(每个枚举项的名称)由key()返回;使用keyCount()查找键的数目。isFlag()返回枚举

OceanStar的博客 1569

深入理解 Qt 元对象系统:QMetaEnum 的应用与实践

本文深入探讨了Qt中的QMetaEnum类,介绍了其在运行时处理枚举类型的能力。主要内容包括:QMetaEnum的基本概念、获取方法(通过QObject元对象或fromType)、常用API(获取名称、键、范围等),以及实际应用场景(国际化支持、配置管理、动态UI生成)。文章还提供了高级技巧和常见问题解决方案,帮助开发者更好地利用这一功能提升代码灵活性和可维护性。QMetaEnumQt元对象系统中强大的反射工具,适合需要动态访问枚举信息的场景。

软件科学-郝学胜 2429

QtQMetaEnum的简单使用(含源码和注释)

本文介绍了QtQMetaEnum枚举元数据操作的相关功能和使用方法。主要内容包括:1)通过Q_ENUM、Q_DECLARE_FLAGS和Q_FLAG宏注册和使用枚举;2)演示枚举名称、作用域、标记属性等基础信息的获取;3)实现枚举字符串的相互转换操作;4)提供枚举Flag的测试示例代码,展示setFlag()和testFlag()的使用方法;5)区分普通枚举C++11枚举类的处理方式。文章通过实际代码示例详细说明了如何在Qt项目中注册和管理枚举类型,并利用QMetaEnum进行元数据操作和类型转换

lw的博客 637

QMetaEnum详解

QMetaEnum详解

xie__jin__cheng的博客 961

QT-枚举字符串互相转换

自:https://cloud.tencent.com/developer/article/1463790 步骤: 项目文件添加 QT+=core; 创建类 Car继承于 QObject并使用 Q_OBJECT宏; 类内添加枚举 Color; 使用 Q_ENUM宏将 Color枚举注册到元对象系统中; 使用 QMetaEnum::fromType获取枚举QMetaEnum对象; 使用 val...

woshigaowei5146的博客 1129

QT QMetaEnum枚举字符串

一、示例 #include <QMetaType> #include <QMetaEnum> #include <QDebug> class MyClass : public QObject{ Q_OBJECT public: // key --- value enum FruitsType { apple = 1, pear = 4, banana = 5 }; // 必

guorong520的博客 569

QT输出枚举字符串

举例,串口的错误号是一个枚举类型:enum QSerialPort::SerialPortError     定义一个变量: enum QSerialPort::SerialPortError error_num; 我想在error_num=1时,输出字符串“QSerialPort::DeviceNotFoundError”, 方法如下: QMetaEnum metaEnum =...

野生猿-群号1025127672 2880

QMetaEnum利用Qt元数据实现枚举(enum)类型字符串转换

版权声明:若无来源注明,Techie亮博客文章均为原创。 载请以链接形式标明本文标题和地址: 本文标题:QMetaEnum利用Qt元数据实现枚举(enum)类型字符串转换本文地址:http://techieliang.com/2017/12/622/ 文章目录 1. 介绍 2. 自定义枚举类型 3. QMetaEnum使用 ...

weixin_30258027的博客 230

QT中enum和QString的互相转换

1、使用Q_ENUM宏注册(注意:1、必须继承QObject, 2、在QT5.5版本引入) #include <QObject> class Cenum: public QObject { Q_OBJECT public: Cenum() {} enum Priority { High, ...

weixin_34221073的博客 3666

Qt5 枚举名与字符串

qt5 枚举名与字符串

gaoyuelong的博客 429

Qt Q_ENUM enum QString 枚举字符串C++模板应用

项目中我们常用到命名,使用 enum 成 string ,方便简洁;Qt给我们提供了一个很方便的功能 Q_ENUM,可以实现枚举字符串QMetaEnum::fromType获取枚举QMetaEnum对象;valueToKey或 keyToValue进行转换操作。Q_ENUM宏将枚举注册到元对象系统中;输出:show : Head。输出:show : Head。输出:show : 100。输出:show : 100。下面我们看一下具体应用;Part3: 使用模板。

q610098308的专栏 1039

QT枚举类型与字符串类型相互转换

Qt5以后(具体版本可能是5.10吧,这个不确定)采用以下方法 https://www.cnblogs.com/dongc/p/5630444.html 在QT中将枚举类型注册(QT_Q_ENUM或QT_Q_FLAG)后,就可以利用QT的元对象进行枚举类型与字符串类型转换了。 代码示例: #include &lt;QtCore/QMetaEnum&gt; int main()...

weixin_34214500的博客 1849

C++/Qt 元类型——枚举 序列化与反序列化

【代码】C++/Qt 元类型——枚举 序列化与反序列化。

windSnowLi 1035
上一篇: Qt Widgets 之 QDockWidget(停靠窗口)
下一篇: Python 3 数字(Number)、各运算符、数学函数一览表
Oo安暖oOo
博客等级 码龄11年 18粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值