QMetaEnum利用Qt元数据实现枚举(enum)类型值及字符串转换
参考链接: 
https://www.cnblogs.com/techiel/p/8023333.html
文章目录
1. 介绍 QMetaEnum
QMetaEnum类属于Qt core模块,提供了一系列针对枚举类型的操作函数,当然不能操作任意枚举类型,若想进行自定义枚举的操作,首先需要对枚举做处理,此时需要QObject类的帮助,使用此类提供的Q_ENUM模板。
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就是枚举定义里面的字符串。同时还提供了枚举名称、枚举类型所属类、枚举项数量的函数,使用很方便。
  作者:
  怪小子
  Github: 
  https://github.com/MrSunHua
  邮箱:sh4a01@163.com
本文版权归作者和博客园共有,欢迎转载,如文章有版权冲突或者有更好的见解及建议,还望联系博主讨论并修改。 
 
                    
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号