Qt技巧-枚举与字符串互相转换

利用Qt元对象系统的特性实现对枚举类型与字符串的互相转换功能。

1 使用方法

  1. 项目文件添加QT += core;
  2. 创建类Car继承于QObject并使用Q_OBJECT宏;
  3. 类内添加枚举Color;
  4. 使用Q_ENUM宏将Color枚举注册到元对象系统中;
  5. 使用QMetaEnum::fromType获取枚举的QMetaEnum对象;
  6. 使用valueToKeykeyToValue进行转换操作。

2 枚举转字符串

  • 接口:

    1
    const char *QMetaEnum::valueToKey(int value) const
  • 输入: value为枚举值;

  • 输出: 枚举的字符串形式(没有找到枚举值返回空字符串)。

3 字符串转枚举

  • 接口:

    1
    int QMetaEnum::keyToValue(const char *key, bool *ok = nullptr) const
  • 输入: key为枚举字符串;

  • 输出: 返回值为枚举值,ok值为是否转换成功(需要做判断)。

4 注意事项

  • 暂不推荐在cpp文件内创建继承于QObject的类或使用Q_OBJEC宏。

5 示例

  • Car.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <QObject>

    class Car : public QObject
    {
    Q_OBJECT
    public:
    Car(QObject *parent = 0) {}
    ~Car() {}

    enum Color { RED, GREEN, BLUE };
    Q_ENUM(Color)
    };
  • main.cpp部分代码

    1
    2
    3
    4
    5
    6
    QMetaEnum metaColor = QMetaEnum::fromType<Car::Color>();

    bool isOk = false;
    qDebug()<<metaColor.valueToKey(Car::BLUE);
    qDebug()<<metaColor.keyToValue("BLUE", &isOk)<<isOk; // OR
    qDebug()<<metaColor.keyToValue("Car::BLUE", &isOk)<<isOk;