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

QMetaEnum利用Qt元数据实现枚举(enum)类型值及字符串转换 介绍 QMetaEnum类属于Qt core模块,提供了一系列针对枚举类型的操作函数,当然不能操作任意枚举类型,若想进行自定义枚举的操作,首先需要对枚举做处理,此时需要QObject类的帮助,使用此类提供的Q_ENUM模板。 详细信息请见官方文档:QObject、QMetaEnum 自定义枚举类型 #include <QObject> class TestClass ... 阅读详情
AI摘要

本文详细介绍了Qt中Q_ENUM宏的使用方法,包括如何声明枚举类型并使其自动注册到Qt元对象系统,无需使用Q_DECLARE_METATYPE。文章通过实例展示了如何使用QMetaEnum进行枚举类型和字符串之间的转换。

在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 QMetaEnum.
Registered enumerations are automatically registered also to the Qt meta type system, making them known to QMetaType without the need to use Q_DECLARE_METATYPE(). This will enable useful features; for example, if used in a QVariant, you can convert them to strings. Likewise, passing them to QDebug will print out their names.
Mind that the enum values are stored as signed int in the meta object system. Registering enumerations with values outside the range of values valid for int will lead to overflows and potentially undefined behavior when accessing them through the meta object system. QML, for example, does access registered enumerations through the meta object system.

用了Q_ENUM,就是注册到了Qt的元对象系统中,而不用再用Q_DECLARE_METATYPE(),就可以直接用QVariant进行转换。
这种枚举在Qt中是以有符号的int存储的。
可以通过QMetaEnum::fromType()获得QMetaEnum,然后就可以通过QMetaEnum进行字符串到枚举,枚举到字符串的转换,以及一些其他的转换,具体大家可以在帮助手册中看看QMetaEnum的接口。

还是通过举例来看怎么用,比较直接。

MyClass.h

#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>

class MyClass : public QObject
{
    Q_OBJECT

public:
    MyClass(QObject *parent = nullptr) : QObject(parent) {}
    ~MyClass() {}

    enum Priority
    {
        High,
        Low,
        VeryHigh,
        VeryLow
    };
    Q_ENUM(Priority)
};

#endif // MYCLASS_H

在main.cpp中
包含头文件

#include "MyClass.h"
#include <QMetaEnum>
#include <QDebug>

使用QMetaEnum对象转换

qDebug() << MyClass::High << "\t" << MyClass::Low;
QMetaEnum metaEnum = QMetaEnum::fromType<MyClass::Priority>();
qDebug() << metaEnum.valueToKey(MyClass::VeryHigh);
qDebug() << metaEnum.keyToValue("VeryHigh");

运行结果:

MyClass::High 	 MyClass::Low
VeryHigh
2

参考:
QT中enum和QString的互相转换
QMetaEnum利用Qt元数据实现枚举(enum)类型值及字符串转换
Q_ENUM与Q_ENUMS的区别

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

相关推荐

【Qt】enum和QString的相互转换

使用Q_ENUM注册enum Q_ENUM使用元对象系统meta-object来注册,因此在enum所在的类中必须包含宏Q_OBJECT或者Q_GADGET。

郭老二 5989

QMetaEnum和Q_ENUM以及遇到的问题

1.error: static assertion failed: QMetaEnum::fromType only works with enums declared as Q_ENUM or Q_FLAG Q_STATIC_ASSERT_X(QtPrivate::IsQEnumHelper::Value, 2.error: ‘qt_getEnumMetaObject’ was not declared in this scope const QMetaObject *metaObject =

m0_67254672的博客 1701

手把手教你用Synopsys AHB VIP搭建验证环境:从SINGLE到WRAP16的完整波形分析与避坑指南

本文详细介绍了如何使用Synopsys AHB VIP搭建验证环境,从基础配置到复杂波形调试实战。重点解析了AHB协议中各种Burst类型的地址计算机制,包括INCR和WRAP类型,并提供了实际案例和避坑指南,帮助工程师快速掌握验证技巧。

weixin_42552716的博客 416

QMetaEnum::fromType : 将Enum作为字符串输出

项目中的错误码使用的是Enum类型,因此每次输出错误码为数字时,还需查看对应的错误类型,幸好Qt已经有QMetaEnum类,可以将Enum 输出为string,在看到错误提示时,一目了然。 QMetaEnum Class QMetaEnum::fromType enum class Reason : int { Failure = -1, Success = 0, Memory_unavailable = 1, Access_violation = 2, Parameter_value_inapp

u013804856的博客 1569

告别昂贵硬件!用Unity3D 2023 + ROS2 Humble搭建你的第一个SLAM仿真实验室(保姆级教程)

本文提供了一份详细的教程,介绍如何使用Unity3D 2023和ROS2 Humble搭建SLAM仿真实验室,无需昂贵硬件即可实现虚拟传感器模拟和算法测试。通过Docker容器配置、ROS2安装优化及Unity插件集成,开发者可以快速构建高精度的仿真环境,适用于自主导航、多传感器标定等场景。

weixin_42526353的博客 436

Ubuntu22.04 上ROS1 Noetic的安装与常见问题解决

本文详细介绍了在Ubuntu 22.04系统上安装ROS1 Noetic的两种主要方法:推荐使用社区维护的适配仓库进行便捷安装,并提供了从源码编译的备选方案。文章重点解决了安装后编译ROS包时极易遇到的“shared_mutex”等C++标准库冲突问题,并给出了其他常见错误的排查与解决指南,帮助开发者顺利搭建稳定的ROS开发环境。

weixin_29295541的博客 364

Qt QVariant

Qt QVariant

ALWAYS LEARNING 698

手把手教你用STM32CubeMX和HAL库驱动MT6835磁编码器(SPI读取21位角度)

本文详细介绍了如何使用STM32CubeMX和HAL库驱动MT6835磁编码器,通过SPI接口读取21位高精度角度数据。从硬件准备、CubeMX配置到HAL库驱动实现与优化,提供了完整的实战指南,帮助开发者快速掌握磁编码器的应用技巧,适用于机器人关节和精密仪器等高精度场景。

weixin_28716769的博客 439

Qt枚举之枚举与字符串互相转换(模板)

1.Qt4 代码如下(示例): #ifndef CLASSENUM_H #define CLASSENUM_H #include <QObject> #include <QMetaEnum> #include <QString> class ClassEnum:public QObject { Q_OBJECT public: enum Color { red, green, black .

passworddddddd的博客 1576

html一号店项目代码,项目一号店素材(html模板)

【实例简介】【实例截图】【核心代码】oneShop├── css│ ├── ShopShow.css│ ├── base.css│ ├── load.css│ ├── logo.css│ ├── register.css│ └── style.css├── detail.html├── images│ ├── Thumbs.db│ ├── a_close.png│...

weixin_35390150的博客 4990

ECC椭圆曲线加解密原理详解(配图)

椭圆曲线加解密原理详解 本文主要参照:ECC椭圆曲线详解(有具体实例)[1] 前言: 椭圆曲线(ECC)加密原理跟RSA加解密原理比起来,可真是晦涩难懂。拜读了大神Kalafinaian文章“ECC椭圆曲线详解(有具体实例)”,终于看到了参透的曙光。 由于原文中有微小的瑕疵,也为了便于阅读起来更加流畅,我重新整理了一下这篇文章。 为什么使用椭圆曲线加密算法? RSA的解决分解整数问题需要亚指数...

Mark的博客 7万+

【QT】枚举与字符串互相转换

利用Qt元对象系统的特性实现对枚举类型与字符串的互相转换功能。

qq_43331089的博客 1486

深度解析与实战:长短时记忆网络(LSTM)在股票走势预测中的应用(基于Python + PyTorch)

本文全面探讨了LSTM在股票价格预测中的应用,从理论基础到实践操作。文章首先强调了股票市场预测的重要性,并介绍了LSTM网络结构及其在处理时间序列数据中的优势。接着,详细说明了数据预处理的关键步骤,包括数据收集、清洗、特征选择和归一化。文章还讨论了LSTM模型的构建、训练和评估,并提供了Python及PyTorch的实操案例。最后,总结了LSTM在股票预测的成果,并提出了未来研究的方向,如模型优化和特征工程,旨在帮助读者掌握LSTM在股票价格预测中的应用,并探索提升模型性能的方法。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2105

Qt Q_ENUM使用 枚举字符串互转

目录1.简述2.代码 1.简述 Qt 中支持了枚举与字符串互转的用法,通过moc编译器实现,所以使用的时候需要添加Q_OBJECT宏,并且声明为public属性,以便外部使用。 2.代码 头文件里这么写 class Dialog : public QDialog { Q_OBJECT public: enum EnmState{ ENM_STATE_A = 0, ENM_STATE_B = 2, ENM_STATE_C, };

我是唐 8104

编程实践:寒武纪-LLM&VLM模型量化&部署

本文介绍了在MLU370-S4平台上对大模型(LLM/VLM)进行量化的两种方法:SmoothQuant和WeightOnly。以Qwen2-VL-2B模型为例,详细说明了两种量化方式的命令行参数配置,包括必须设置的per_channel选项和量化参数调整建议。量化完成后,提供了模型部署的具体命令示例,包含设备分配、端口设置、并行度等关键参数。文章强调在MLU370芯片上需要手动设置block_size,并指出两种量化方式只能二选一使用。配套资料已上传至百度网盘供参考。

微风❤水墨 510

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Qt技巧-枚举与字符串互相转换

利用Qt元对象系统的特性实现对枚举类型与字符串的互相转换功能。 1 使用方法 项目文件添加QT += core; 创建类Car继承于QObject并使用Q_OBJECT宏; 类内添加枚举Color; 使用Q_ENUM宏将Color枚举注册到元对象系统中; 使用QMetaEnum::fromType获取枚举的QMetaEnum对象; 使用valueToKey或keyToValue进行转换操作。...

Qt君 9864

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

q2nAmor 2474

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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的博客 3668

QMetaEnum类获取枚举值信息

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

浮生流年的博客 1665

Qt技巧-枚举转换遍历

利用Qt元对象特性来对枚举与字符串转换和遍历。

Qt君 3570

QMetaEnum获取枚举元信息

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

5031

QT-枚举与字符串互相转换

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

woshigaowei5146的博客 1132

Qt_Q_ENUM使用 枚举字符串互转

目录 1.简述 2.Q_ENUM用法 2.1 声明使用 2.2 测试例子 3.用模板实现一个字符串枚举互转 3.1代码 3.2 用法示例 1.简述 数据库里用到了枚举的存储,比如一个设备有两个状态,保持数据库和代码的可读性,当然是用枚举了,那就需要把枚举转成字符串存储进去,读的时候再转回来。 Qt 中支持了枚举与字符串互转的用法,通过moc编译器实现, 所以使用的时候需要添加Q_OBJECT宏,继承QObject, 并且声明为public属性,以便外部使用。 2.Q_ENUM用法 2.1 声明使用 clas

weixin_43124720的博客 1639

Qt中枚举类型转字符串输出(enum转QString)

Qt中枚举类型转字符串输出(enum转QString)

weixin_43935474的博客 1万+

Qt:QMetaEnum类

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的博客 1572
上一篇: Qt界面focus焦点设置的一些体会
下一篇: 去掉QString中的任意空白符
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值