我想要做的是在c ++中使用以下枚举:
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)
}
有更好的方法吗?
答案 0 :(得分:3)
我找到了以下工作:
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
强制转换为int。我仍然愿意接受更优雅的解决方案。
修改强>
正如预期的那样,这会破坏QML / Javascript方面的switch
和===
。与switch(enumValue.valueOf())
导出的枚举整数进行比较时,必须使用==
和Q_ENUM()
,例如MyClass.MyEnumElement
:
switch(myClass.enumValue.valueOf()){
case MyClass.MyEnumElement:
...
break;
}
和
if(myClass.enumValue == MyClass.MyEnumElement)
...