Qt开发:枚举的介绍和使用

一、概述

  在 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();
}

输出结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值