С помощью простых перечислений я смог получить доступ к свойствам 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; также этот вопрос актуально):
.час:
#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;
}
выход:
«Наберите «А»
Других решений пока нет …