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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
 

介绍

QMetaEnum类属于Qt core模块,提供了一系列针对枚举类型的操作函数,当然不能操作任意枚举类型,若想进行自定义枚举的操作,首先需要对枚举做处理,此时需要QObject类的帮助,使用此类提供的Q_ENUM模板。

详细信息请见官方文档:QObjectQMetaEnum

自定义枚举类型

#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中一直报错,具体原因没有详细研究

QMetaEnum使用

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

QMetaEnum: C++ 中将枚举自动转换字符串 当我们需要在日志中输出枚举类型的信息时,如果只记录一个数字,查看日志时就需要再去查找这个枚举的意思,不直观,不方便,我们会希望可以直接输出这个枚举对应的字符串。比如下面这个枚举 Color,我们该如何将枚举 Red 转化为字符串 “Red”? enum Color{ Red, Orange, Yellow, green }; # 运算符 一种最直接的方法是:使用 map 或者 list 之类的容器做一个映射。还有一个更简单的做法,我们可以借助宏 (macro) 的 # 运算符 (Stringi 阅读详情

相关推荐

QMetaEnum获取枚举元信息

QMetaEnum 类提供了一个枚举元数据。我们可以使用该类的静态模板函数,fromType来获得关于某个枚举QMetaEnum对象,然后就可以调用该类的成员函数来获得该枚举的相关信息。该枚举必须使用Q_ENUM宏进行声明。

5026

QT数据类型强制转换

QT数据类型强制转换 C++提供了4种类型转换操作符来应对不同场合的应用。 操作符 注释 const_cast 去const属性 static_cast 静态类型转换,如int转换成char dynamic_cast 动态类型转换,如子类和父类之间的多态类型转换 reinterpret_cast 仅仅重新解释类型,但没有进行二进制的转换 const_cast //!...

滴水成河 百川归海 4188

Qt枚举字符串教程

枚举类型Enum type)在Qt中是一种非常常用的数据类型。在实际开发中,我们通常需要将枚举类型转换字符串或者将字符串转换枚举类型。本文将介绍利用Qt的元对象系统(Meta-Object System)实现枚举类型字符串的互相转换功能。对于枚举类型,我们可以通过QMetaEnum的valueToKey()函数将其转换成对应的字符串。对于字符串,我们可以通过QMetaEnum的keyToValue()函数将其转换成对应的枚举类型。在Qt中,我们可以使用Q_ENUM宏将枚举类型注册到元对象系统中。

. 1310

Qt中自定义结构体、枚举型做信号参数传递

参考链接 如何在QT信号和插槽中使用枚举 Qt出现QObject::connect: Cannot queue arguments of type '******'的解决方法; 问题 当自定义结构体、枚举通过信号的参数进行传递的时候,运行以后可能会报错“QObject::connect: Cannot queue arguments of type 'XXX'”,此时信号与槽不一定会生效,但是编译过程是没问题的。因此,这样的问题比较麻烦,应该尽力规避。 解决 出现这样的问题是由于自定义的结构体、枚举,没

ZefinNg的博客 7602

int 转 Qt enum

【代码】int 转 Qt enum

海天鹰 498

关于Q_ENUMS和Q_ENUM的区别和用法

1.使用Q_ENUM 1).枚举定义和Q_ENUM都在Q_OBJECT下面并且在public上面 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT enum Action { Open, Save, New, Copy, Cut, Paste, Undo, Redo, D

刘一儿(嵌入式) 6352

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

Qt帮助文档中查Q_ENUM,Q_ENUM是自Qt 5.5引入的。 可以看到: Enumerations that are declared with Q_ENUM have their QMetaEnum registered in the enclosing QMetaObject. You can also use QMetaEnum::fromType() to get the QMe...

斧冰 8983

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君 3555

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

QMetaEnum 使用详解

在使用 QMetaEnum 之前,你需要先定义一个枚举类型,并且确保它是 QObject 的子类的一部分。你可以使用 Q_ENUM 宏来注册你的枚举类型,这样 QMetaEnum 就能够识别并操作它了。Q_OBJECTpublic:在这个例子中,Priority是一个枚举类型,它被注册到了 Qt 的元对象系统中。

github_37290846的博客 980

Qt 遍历一个枚举类型里面的内容

QT 遍历一个枚举变量 利用Qt元对象特性来对枚举字符串转换和遍历。 QMetaEnumQMetaEnum类提供有关枚举器的元数据。 返回与模板参数中的类型相对应的QMetaEnumQMetaEnum QMetaEnum::fromType() 注意: 枚举需要用Q_ENUM声明(如下例)。 class Object : public QObject { Q_OBJECT public: Object(); enum WeekDay { Monday = 1, Tuesday, Wednesd

dhl11的博客 2900

QMetaEnum详解

QMetaEnum详解

xie__jin__cheng的博客 961

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

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

lw的博客 637

qt判断读入的字符串是否含有英文_Qt技巧-枚举转换遍历

利用Qt元对象特性来对枚举字符串转换和遍历。1. QMetaEnumQMetaEnum类提供有关枚举器的元数据。返回与模板参数中的类型相对应的QMetaEnumQMetaEnum QMetaEnum::fromType() 注意: 枚举需要用Q_ENUM声明(如下例)。class Object : public QObject { Q_OBJECT public: Objec...

weixin_39837867的博客 196

QMetaEnumd 使用

enumeType { eType_one= 0, eType_Two, eType_Three, }; Q_ENUM(eType) // 注册QMetaEnum 1、QMetaEnum提供了enum-》string enum-》string 2、转化 templa...

qq_15821883的博客 436

Qt 元对象系统(Meta-Object System)深度解析:从 MOC 到反射式编程

(Q_DECLARE_METATYPE 缺失时,模板元数据不足)。

ITOfDragon的博客 410
上一篇: Qt多线程-总结QThread-QThreadPool-QtConcurrent
下一篇: Qt程序打包,自动拷贝依赖文件
coologic
博客等级 码龄7年 35粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值