在QML中将C ++枚举用作字符串 [英] Using c++ enum in QML as string
问题描述
我想在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屋!