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

Using c++ enum in QML as string

本文关键字:枚举 字符串 c++ QML      更新时间:2023-10-16

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

有没有更好的方法可以做到这一点?

我发现以下内容可以工作:

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===。 与Q_ENUM()导出的枚举整数进行比较时,必须使用switch(enumValue.valueOf())==,例如MyClass.MyEnumElement

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

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