簡體   English   中英

在QML中使用c ++枚舉作為字符串

[英]Using c++ enum in QML as string

我想要做的是在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現在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()情況下使用仍會導致QVariantQVariant轉換為int。 我仍然願意接受更優雅的解決方案。

編輯:

正如預期的那樣,這會打破QML / Javascript端的switch=== switch(enumValue.valueOf())==必須比較枚舉通過出口整數時,可以使用Q_ENUM()MyClass.MyEnumElement

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM