Qt技巧-枚举转换遍历

利用Qt元对象特性来对枚举与字符串转换和遍历。

1. QMetaEnum类

  1. QMetaEnum类提供有关枚举器的元数据。

  2. 返回与模板参数中的类型相对应的QMetaEnum。

    1
    QMetaEnum QMetaEnum::fromType()

注意: 枚举需要用Q_ENUM声明(如下例)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Object : public QObject
{
Q_OBJECT
public:
Object();
enum WeekDay {
Monday = 1,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};

Q_ENUM(WeekDay)
};

2. 枚举转字符串

  • 方法一:
    通过枚举下标获取对应字符串。

    1
    const char *key(int index) const
  • 方法二:
    通过枚举获取对应的字符串。

    1
    const char *valueToKey(int value) const
  • 例:

    1
    2
    3
    QMetaEnum metaEnum = QMetaEnum::fromType<Object::WeekDay>();
    const char *weekDayStr = metaEnum.valueToKey(Object::Sunday);
    qDebug() << weekDayStr;

3. 字符串转枚举

  • 可以通过ok的值来判断是否正确转换。

    1
    int keyToValue(const char *key, bool *ok = nullptr) const
  • 例:

    1
    2
    3
    4
    5
    6
    7
    QMetaEnum metaEnum = QMetaEnum::fromType<Object::WeekDay>();
    bool isOk = false;
    Object::WeekDay weekDay = (Object::WeekDay)metaEnum.keyToValue("Sunday",
    &isOk);
    if (isOk) {
    qDebug() << weekDay;
    }

4. 遍历

1
2
3
4
5
6
7
8
9
QStringList list;
QMetaEnum metaEnum = QMetaEnum::fromType<Object::WeekDay>();

for (int i = 0; i < metaEnum.keyCount(); i++) {
list += metaEnum.valueToKey(metaEnum.value(i));
// Or list += metaEnum.key(i);
}

qDebug() << list;