2016-06-06 3 views
4

Что я хотел бы сделать, это использовать ниже перечисления в C++:Использование C++ перечисления в QML как строка

class MyClass : public QQuickItem { 
    Q_OBJECT 
    Q_PROPERTY(MyEnum enumValue READ getEnumValue) 

public: 
    enum MyEnum{ 
     MyEnumElement = 0 
    }; 
    Q_ENUM(MyEnum) 

slots: 
    MyEnum getEnumValue(){ 
     return enumValue; 
    } 

private: 
    MyEnum enumValue = MyEnumElement; 
}; 

Таким образом, в QML:

MyClass { 
    id: myClass 
} 

Text { 
    text: "enumValue is: " + myClass.enumValue 
} 

Это приведет к enumValue is MyEnumElement вместо enumValue is 0, который имеет место сейчас. Решение, которое я есть сейчас, заключается в следующем, однако безвкусный:

class MyClass : public QQuickItem { 
    Q_OBJECT 
    Q_PROPERTY(MyEnum enumValue READ getEnumValue) 

public: 
    enum MyEnum{ 
     MyEnumElement = 0 
    }; 
    Q_ENUM(MyEnum) 
    QMetaEnum MyEnum_MetaEnum = QMetaEnum::fromType<MyEnum>(); 
    Q_INVOKABLE QString getEnumString(MyEnum enumVal){ 
     return MyEnum_MetaEnum.valueToKey(enumVal); 
    } 

slots: 
    MyEnum getEnumValue(){ 
     return enumValue; 
    } 

private: 
    MyEnum enumValue = MyEnumElement; 
}; 

И:

MyClass { 
    id: myClass 
} 

Text { 
    text: "enumValue is: " + myClass.getEnumString(myClass.enumValue) 
} 

Есть ли лучший способ сделать это?

ответ

2

я нашел следующую работу:

class MyClass : public QQuickItem { 
    Q_OBJECT 
    Q_PROPERTY(QVariant enumValue READ getEnumValue) 

public: 
    enum MyEnum{ 
     MyEnumElement = 0 
    }; 
    Q_ENUM(MyEnum) 

slots: 
    QVariant getEnumValue(){ 
     return QVariant::fromValue(enumValue); 
    } 

private: 
    MyEnum enumValue = MyEnumElement; 
}; 

QML сторона:

MyClass { 
    id: myClass 
} 

Text { 
    text: "enumValue is: " + myClass.enumValue.toString() 
} 

Использование без .toString() до сих пор вызывает QVariant быть приведены к междунар. Я по-прежнему открыт для более элегантных решений.

Edit:

Как и ожидалось, это ломает switch и === на стороне QML/Javascript. switch(enumValue.valueOf()) и == должны быть использованы при сравнении с перечислений Интс, экспортируемых Q_ENUM(), таких как MyClass.MyEnumElement:

switch(myClass.enumValue.valueOf()){ 
    case MyClass.MyEnumElement: 
     ... 
     break; 
} 

и

if(myClass.enumValue == MyClass.MyEnumElement) 
    ... 
Смежные вопросы