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 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的区别

Qt中,可以使用元对象系统(Meta-Object System)来实现枚举类型转换字符串。首先,需要在枚举类型所在的类中使用Q_ENUM宏将枚举类型注册到元对象系统中。然后,可以使用QMetaEnum的valueToKey()函数将枚举转换为对应的字符串。以下是一个示例代码: ```cpp #include <QObject> class Car : public QObject { Q_OBJECT public: Car(QObject *parent = nullptr) {} ~Car() {} enum Color { RED, GREEN, BLUE }; Q_ENUM(Color) }; int main() { QMetaEnum metaColor = QMetaEnum::fromType<Car::Color>(); qDebug() << metaColor.valueToKey(Car::BLUE); // 输出 "BLUE" } ``` 在上述示例中,我们首先使用Q_ENUM宏将Color枚举注册到元对象系统中。然后,通过QMetaEnum::fromType<Car::Color>()获取枚举QMetaEnum对象。最后,使用valueToKey()函数将枚举Car::BLUE转换为对应的字符串"BLUE"。 请注意,为了使用元对象系统,需要在项目文件中添加QT += core,并且在类的定义中使用Q_OBJECT宏。 #### 引用[.reference_title] - *1* *2* [Qt枚举字符串教程](https://blog.youkuaiyun.com/update7/article/details/130097077)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Qt技巧-枚举字符串互相转换](https://blog.youkuaiyun.com/nicai_xiaoqinxi/article/details/90019691)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值