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

参考链接: 
https://www.cnblogs.com/techiel/p/8023333.html

文章目录

1. 介绍 QMetaEnum

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

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

2.自定义枚举类型

/** include qt core header files. */
#include <QObject>

/**
    \brief  This is my custom enumeration type, which is mainly used for log level output control.
    
            该枚举可以与字符类型互转。
*/
class myEnum : QObject
{
    Q_OBJECT

public:

    enum loggure_enum {
        log_debug,
        log_info,
        log_warning,
        log_faild
    };
public:
    /** Q_ENUM 不能放在全局作用域声明。 */
    Q_ENUM(loggure_enum)
};

举类型的声明与c++标准相同,只不过需要将枚举放置在一个继承自QObject的子类中,同时要使用Q_OBJECT模板,在枚举声明后面添加Q_ENUM(enum_name)即可。*

/** Qt 源码中的表现形式 */
#define Q_ENUM(x) Q_ENUMS(x) Q_ENUM_IMPL(x)

/** Q_ENUMS */
#define Q_ENUMS(x) QT_ANNOTATE_CLASS(qt_enums, x)

#ifndef QT_ANNOTATE_CLASS
# ifndef Q_COMPILER_VARIADIC_MACROS
#  define QT_ANNOTATE_CLASS(type, x)
# else
#  define QT_ANNOTATE_CLASS(type, ...)
# endif
#endif

/** Q_ENUM_IMPL */
#define Q_ENUM_IMPL(ENUM) \
    friend Q_DECL_CONSTEXPR const QMetaObject *qt_getEnumMetaObject(ENUM) Q_DECL_NOEXCEPT { return &staticMetaObject; } \
    friend Q_DECL_CONSTEXPR const char *qt_getEnumName(ENUM) Q_DECL_NOEXCEPT { return #ENUM; }

根据宏扩展,Q_ENUM 提供了自身类向 QMetaEnum 类转换。以便于实现 字符 与 key 相互转换。

3.QMetaEnum使用

myEnum e1;
QMetaEnum metaEnum = QMetaEnum::fromType<myEnum::loggure_enum>();

//metaEnum.value(-1);
if (metaEnum.isValid()) {

    qDebug() << "The enumeration type is invalid";
}

qDebug() << metaEnum.name(); /** 枚举名字 */
qDebug() << metaEnum.scope(); /** 范围 */

/** 获取枚举数量,根据序号获取字符串 */
for (int i = 0; i < metaEnum.keyCount(); i++)
    qDebug() << metaEnum.key(i);

/** 根据序列号获取值 */
for (int i = 0; i < metaEnum.keyCount(); i++)
    qDebug() << metaEnum.value(i);

/** 根据值获取字符串 */
QString str = metaEnum.valueToKey(myEnum::loggure_enum::log_debug);
qDebug() << "ch : " << str;

/** 根据字符串获取值 */
auto e2 = metaEnum.keysToValue("log_warning");
qDebug() << "e2 : " << e2;

4.总结

QMetaEnum不光实现了枚举值和字符串的映射关系,key 就是数字12345……,value就是枚举定义里面的字符串。同时还提供了枚举名称、枚举类型所属类、枚举项数量的函数,使用很方便。

posted on 2020-11-21 22:36  怪小子  阅读(1187)  评论(0编辑  收藏  举报