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
本文版权归作者和博客园共有,欢迎转载,如文章有版权冲突或者有更好的见解及建议,还望联系博主讨论并修改。