QMetaEnum и строго типизированное перечисление

С помощью простых перечислений я смог получить доступ к свойствам 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 больше не распознает его как перечисление.

Есть ли какое-либо решение для доступа к символьному представлению перечисления при использовании строго типизированных перечислений?

4

Решение

Q_ENUMS устарела, и Q_ENUM следует использовать вместо этого, но следующий код работает для меня с любым из них (Qt 5.5, ваша проблема может быть вызвана старой версией Qt; также этот вопрос актуально):

.час:

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

.каст:

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

выход:

«Наберите «А»

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]