c++ - QMetaEnum 和强类型枚举

标签 c++ qt c++11 enums strong-typing

使用普通枚举,我能够使用以下代码访问 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"

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

enum class MyEnumType { TypeA, TypeB };

访问元信息不再有效。我想,Qt 不再将其识别为枚举。

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

最佳答案

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

.h:

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

.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;
}

主要内容:

int main()
{
    EnumClass asd;
    return 0;
}

输出:

"TypeA"

关于c++ - QMetaEnum 和强类型枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33215182/

相关文章:

c++ - 在 cpp 中调用方法,如 @selector(someMethod :) in Objective-C

c++ - QNetworkAccessManager 多次上传失败

javascript - 是否有任何 HTML5/Canvas 窗口系统库(ala Qt、WxWidgets 等)?

c++ - 如何在 OSX 上通过 vswprintf 格式化宽字符字符串(想要返回 std::wstring)

c++11 - 弃用通知使用 GTKMM 和 C++11 进行构建

c++ - 没有用户代码的死锁

c++ - 变量引用

c++ - 如何使用 extern 声明枚举类型

c++ - 如果我不应该使用 unsigned,我该如何在类型级别指定一个非负数?

c++ - QMdiArea 子窗口中的 QDockWidget 不能停靠在顶部和底部