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