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

查看:188
本文介绍了在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为MyEnumElement 而不是 enumValue是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)
}

还有更好的方法吗?

推荐答案

我发现以下工作可行:

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端中断开关 === 。与由<$ c导出的枚举int进行比较时,必须使用 switch(enumValue.valueOf()) == $ c> 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天全站免登陆