2015-10-19 3 views
4

С равнинными перечислениями я был в состоянии получить доступ Q_ENUMS свойства и специфический характер represenation из перечислений, с помощью следующего кода:QMetaEnum и сильные типизированное перечисление

// 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 больше не распознает его как перечисление.

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

+0

Какие Qt версии вы используете? – SingerOfTheFall

+0

@SingerOfTheFall: мы используем еще qt4.8, но будем переключаться на qt5 всякий раз, когда мы находим время для этого. – agentsmith

+0

Я не уверен, конечно, но это может быть из-за вашей версии Qt. Кроме того, проверьте http://stackoverflow.com/questions/6513736/qt-support-for-c0x-enum-class – SingerOfTheFall

ответ

1

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"

+0

Согласно вашей ссылке 4.8 поддерживает только некоторые функции C++ 0x, сильные типизированные перечисления не входят в число таких. Я пробовал qt 5.2.1 с Q_ENUMS, так как Q_ENUM был представлен с qt 5.5, и он работает. Благодаря! – agentsmith

+0

@agentsmith, приветствую вас – SingerOfTheFall

Смежные вопросы