2016-06-06 21 views
4

Was würde ich tun möchte, ist die unten Enum in C++ zu verwenden:mit C++ Enum in QML als String

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

In einer solchen Art und Weise in QML:

MyClass { 
    id: myClass 
} 

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

Das in enumValue is MyEnumElement führen würde anstelle von enumValue is 0 was jetzt der Fall ist. Die Lösung, die ich jetzt habe, ist folgende, aber unelegant:

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

Und:

MyClass { 
    id: myClass 
} 

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

Gibt es einen besseren Weg, dies zu tun?

Antwort

2

fand ich folgende Arbeit:

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 Seite:

MyClass { 
    id: myClass 
} 

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

ohne .toString() immer noch mit den QVariant in einem int gegossen werden verursacht. Ich bin immer noch offen für elegantere Lösungen.

Edit:

Wie erwartet, bricht diese switch und === auf der QML/Javascript Seite. switch(enumValue.valueOf()) und == muss verwendet werden, wenn sie von Q_ENUM(), wie MyClass.MyEnumElement zu Enum Ints exportiert Vergleich:

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

und

if(myClass.enumValue == MyClass.MyEnumElement) 
    ...