文章目录
一、概述
在 Qt 中,枚举(enum)是一种用于表示一组具有名称的整型常量的类型,广泛用于状态表示、选项设置、信号与槽的参数传递等场景。Qt 的枚举使用方式和 C++ 的标准 enum 类似,但 Qt 也提供了更强的功能,如与 QMetaObject 系统结合、配合 Q_ENUM 或 Q_ENUMS 宏实现枚举值的字符串转换等。
二、Qt 中定义和使用枚举
2.1 普通枚举的定义方式
class MyClass : public QObject {
Q_OBJECT
public:
enum Status {
Idle,
Running,
Stopped
};
void setStatus(Status s);
};
2.2 使用枚举
MyClass obj;
obj.setStatus(MyClass::Running);
三、配合 Qt 元对象系统使用枚举
3.1 使用 Q_ENUM(Qt 5.5 及以上)
class MyClass : public QObject {
Q_OBJECT
public:
enum Status {
Idle,
Running,
Stopped
};
Q_ENUM(Status)
};
这样做的好处是可以通过 QMetaEnum 反射地访问枚举值,比如将字符串转换为枚举值,或枚举值转换为字符串。
3.2 示例:枚举值转字符串
MyClass::Status status = MyClass::Running;
QMetaEnum metaEnum = QMetaEnum::fromType<MyClass::Status>();
QString name = metaEnum.valueToKey(status); // 得到 "Running"
3.4 示例:字符串转枚举值
int value = metaEnum.keyToValue("Stopped"); // 得到 2
四、枚举与字符串相互转换
#include <QObject>
#include <QMetaEnum>
class StatusHelper : public QObject
{
Q_OBJECT
public:
enum class Status {
Idle = 1,
Running,
Finished,
Error
};
Q_ENUM(Status) // 注册枚举到 Qt 元对象系统
// 枚举转字符串
static QString enumToString(Status s)
{
const QMetaObject &meta = StatusHelper::staticMetaObject;
int index = meta.indexOfEnumerator("Status");
QMetaEnum metaEnum = meta.enumerator(index);
return metaEnum.valueToKey(static_cast<int>(s));
}
// 字符串转枚举
static Status stringToStatus(const QString& str) {
const QMetaObject &meta = StatusHelper::staticMetaObject;
int index = meta.indexOfEnumerator("Status");
QMetaEnum metaEnum = meta.enumerator(index);
int value = metaEnum.keyToValue(str.toUtf8().constData());
if (value != -1)
return static_cast<Status>(value);
else
return static_cast<Status>(-1); // 或者你定义一个 Invalid 值
}
};
代码调用:
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QString str = StatusHelper::enumToString(StatusHelper::Status::Idle);
qDebug() << "str:" << str;
StatusHelper::Status s = StatusHelper::stringToStatus(str);
qDebug() << s;
return app.exec();
}
输出结果:
五、枚举与字符串相互转换(通用版)
class StatusHelper : public QObject
{
Q_OBJECT
public:
enum class Status {
Idle = 1,
Running,
Finished,
Error,
Unknown
};
Q_ENUM(Status) // 注册枚举到 Qt 元对象系统
// 枚举转字符串
template<typename T>
static QString enumToString(const QString& strEnumType, T value)
{
const QMetaObject &metaObj = StatusHelper::staticMetaObject;
const char* pEnumName = nullptr;
// 遍历所有枚举元数据
for (int i = 0; i < metaObj.enumeratorCount(); ++i) {
QMetaEnum metaEnum = metaObj.enumerator(i);
if (QString(metaEnum.name()) == strEnumType) {
pEnumName = metaEnum.valueToKey(static_cast<int>(value));
break;
}
}
return pEnumName ? QString(pEnumName) : QString("Unknown");
}
// 字符串转枚举
template<typename T>
static T stringToEnum(const QString& strEnumType, const QString& strKey, T defaultValue)
{
const QMetaObject &metaObj = StatusHelper::staticMetaObject;
for (int i = 0; i < metaObj.enumeratorCount(); ++i) {
QMetaEnum metaEnum = metaObj.enumerator(i);
if (QString(metaEnum.name()) == strEnumType) {
bool bRet = false;
int iValue = metaEnum.keyToValue(strKey.toUtf8().constData(), &bRet);
if (bRet) {
return static_cast<T>(iValue);
}
}
}
return defaultValue;
}
};
代码调用:
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QString str = StatusHelper::enumToString("Status", StatusHelper::Status::Idle);
qDebug() << "str:" << str;
StatusHelper::Status s = StatusHelper::stringToEnum("Status", str, StatusHelper::Status::Unknown);
qDebug() << s;
return app.exec();
}
输出结果: