在 QML 中使用 c++ 枚举作为字符串 [英] Using c++ enum in QML as string

查看:24
本文介绍了在 QML 中使用 c++ 枚举作为字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想做的是在 c++ 中使用以下枚举:

What I would like to do is use the below enum in 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 中的这种方式:

In such a way in QML:

MyClass {
    id: myClass
}

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

这将导致 enumValue is MyEnumElement 而不是 enumValue is 0 现在就是这种情况.我现在的解决方案如下,但不优雅:

That would result in enumValue is MyEnumElement instead of enumValue is 0 which is the case now. The solution I have now is the following, however inelegant:

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

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

Is there a better way to do this?

推荐答案

我发现以下方法可行:

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.我仍然愿意接受更优雅的解决方案.

Using without .toString() still causes the QVariant to be cast to an int. I'm still open to more elegant solutions.

正如预期的那样,这会破坏 QML/Javascript 端的 switch===.switch(enumValue.valueOf())==Q_ENUM() 导出的枚举整数比较时必须使用,例如 MyClass.MyEnumElement:

As expected, this breaks switch and === on the QML/Javascript side. switch(enumValue.valueOf()) and == must be used when comparing to enum ints exported by Q_ENUM(), such as MyClass.MyEnumElement:

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

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

这篇关于在 QML 中使用 c++ 枚举作为字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆