QML允许我们定义枚举吗?如果是这样,我们如何在QML中声明枚举?
我想在QML中声明一个枚举,如下面的C ++枚举。如果可能的话,我想在没有任何JavaScript的情况下这样做。
enum Color { RED, GREEN, BLUE };
Color r = RED;
switch(r)
{
case RED : std::cout << "red\n"; break;
case GREEN: std::cout << "green\n"; break;
case BLUE : std::cout << "blue\n"; break;
}
我该怎么办?
答案 0 :(得分:15)
从Qt 5.10开始,QML直接支持枚举。 See Qt documentation which contains sample code.
您可以使用enum
关键字定义一个。 类型及其值必须以大写字母开头,否则请遵循命名变量的规则(例如,可以包含数字和下划线)。
要使用枚举,您必须明确包含完整范围,包括组件ComponentName.EnumType.EnumValue
。即使在组件本身内使用它也是如此。
e.g。
// MyComponent.qml
Rectangle {
id: root
// Define Shape enum
enum Shape {
None,
Round,
Pointy,
Bobbly,
Elusive
}
// Note: property using enum is of type int
property int selectedShape: MyComponent.Shape.None
visible: selectedShape !== MyComponent.Shape.None
color: selectedShape === MyComponent.Shape.Pointy? "red": "green"
}
请注意,枚举值被视为int
,您可以按原样分配和比较它们。
虽然未记录(因此可能会发生变化),但默认情况下,第一个值为0
,第二个1
等。但是,您可以指定非负整数值。您甚至可以将两个枚举值分配给相同的整数值,尽管这可能不是一个好主意。您不能指定一个求值为整数的表达式。
e.g。
enum Shape {
None = 5, // valid
Round, // automatically assigned 6
Pointy = -1, // not valid
Bobbly = Round // not valid
Elusive = (8-7) // not valid
}
感谢Michael Brasser's blog comment about assigning simple values。
答案 1 :(得分:12)
您可以使用纯Qml单例,因此您不需要任何C ++或javascript。
颜色/ MyColors.qml:
pragma Singleton
import QtQuick 2.5
QtObject {
id: singleton
property int red: 0
property int green: 1
property int blue: 2
}
颜色/ qmldir:
singleton MyColors 1.0 MyColors.qml
您的qml文件:
import "colors" 1.0
// MyColors.red
// MyColors.green
// MyColors.blue
答案 2 :(得分:4)
首先,使用enum class
代替enum
以提高类型安全性
enum class Color { RED, GREEN, BLUE };
Color r = Color::RED;
然后使用Q_ENUMS
将其注册为Qt(使用Q_ENUM
获取Qt 5.5 +):
mycolors.h
#pragma once
#include <QObject>
class MyColors : public QObject
{
Q_OBJECT
public:
enum class Color {
RED,
GREEN,
BLUE
};
Q_ENUMS(Color)
static void init();
};
要使枚举在QML中可用,请将其注册(在mycolors.cpp文件中):
void MyColors::init()
{
qRegisterMetaType<MyColors::Color>("MyColors::Color");
qmlRegisterType<MyColors>("MyQmlModule", 1, 0, "MyColors");
}
并在Colors::init()
中致电main()
。
在QML中你现在有
import MyQmlModule 1.0
// MyColors.RED
// MyColors.GREEN
// MyColors.BLUE
答案 3 :(得分:2)
从Qt 5.10开始,您现在也可以直接在QML中声明枚举类型:https://v-play.net/updates/v-play-2-15-0-qt-5-10-qt-creator-4-5-support-firebase-data-structures-and-queries#qt-5-10-qml-enum-instanceof
// MyText.qml
import QtQuick 2.0
Text {
enum MyEnum {
Normal,
Heading
}
property int textType: MyText.MyEnum.Normal
font.bold: textType == MyText.MyEnum.Heading
font.pixelSize: textType == MyText.MyEnum.Heading ? 24 : 12
}
// Main.qml
import VPlayApps 1.0
App {
MyText {
textType: MyText.MyEnum.Heading
text: "I'm a headline."
}
}