如何在没有任何JavaScript的情况下在QML中声明枚举?

时间:2015-12-25 08:45:20

标签: qt enums qml

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

我该怎么办?

4 个答案:

答案 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."
  }
}