QMetaEnum 和强类型枚举

age*_*ith 7 c++ enums qt strong-typing c++11

使用普通枚举,我可以使用以下代码访问 Q_ENUMS 属性和具体的枚举的字符表示:

// in .h
class EnumClass : public QObject
{
  Q_OBJECT
public:
  enum  MyEnumType { TypeA, TypeB };
  Q_ENUMS(MyEnumType)
private:
  MyEnumType m_type;
};

// in .cpp
m_type = TypeA;
...
const QMetaObject &mo = EnumClass::staticMetaObject;
int index = mo.indexOfEnumerator("MyEnumType");
QMetaEnum metaEnum = mo.enumerator(index);
QString enumString = metaEnum.valueToKey(m_type); // contains "TypeA"
Run Code Online (Sandbox Code Playgroud)

如果我想将 c++11 功能用于强类型枚举,例如

enum class MyEnumType { TypeA, TypeB };
Run Code Online (Sandbox Code Playgroud)

访问元信息不再起作用。我想,Qt 不再将其识别为枚举。

是否有任何解决方案可以在使用强类型枚举时访问枚举的字符表示?

Sin*_*all 4

Q_ENUMS已过时,Q_ENUM应该改用,但以下代码对我来说适用于其中任何一个(Qt 5.5,您的问题可能是由旧的 Qt 版本引起的;这个问题也是相关的):

。H:

#include <QObject>
class EnumClass : public QObject
{
    Q_OBJECT
public:
    enum class MyEnumType { TypeA, TypeB };
    EnumClass();
    Q_ENUM(MyEnumType)
private:
    MyEnumType m_type;
};
Run Code Online (Sandbox Code Playgroud)

.cpp:

#include <QDebug>
#include <QMetaEnum>
#include <QMetaObject>
EnumClass::EnumClass()
{
    m_type = MyEnumType::TypeA;
    const QMetaObject &mo = EnumClass::staticMetaObject;
    int index = mo.indexOfEnumerator("MyEnumType");
    QMetaEnum metaEnum = mo.enumerator(index);
    // note the explicit cast:
    QString enumString = metaEnum.valueToKey(static_cast<int>(m_type));
    qDebug() << enumString;
}
Run Code Online (Sandbox Code Playgroud)

主要的:

int main()
{
    EnumClass asd;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

“A型”