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

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值