在QML中使用c ++枚举作为字符串

时间:2016-06-06 17:16:09

标签: c++ qt enums qml qtquick2

我想要做的是在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)
}

有更好的方法吗?

1 个答案:

答案 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)
    ...