Как мы можем сделать объявление перечисления только в qml, а не в javascript?

Мой вопрос, как мы можем определить перечислитель в qml? или мы можем определить объект с таким же enum в C++ в qml? перечисление объекта, как показано ниже исходного кода, я хочу сделать это в qml, а не javascript в Qt, что мне делать? Спасибо за ответ,

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

я хочу знать, Qml имеет способность определять enum в нем? Спасибо за ответ

4 ответа

Решение

Вы можете использовать чистый синглтон 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

Начиная с Qt 5.10, перечисления напрямую поддерживаются в QML. Смотрите документацию Qt, которая содержит пример кода.

Вы можете определить один с enum ключевое слово. Тип и его значения должны начинаться с заглавной буквы, но в остальном следовать правилам именования переменной (например, могут включать цифры и подчеркивание).

Чтобы использовать перечисление, вы должны явно включить полную область, включая компонент ComponentName.EnumType.EnumValue, Это верно даже при использовании его внутри самого компонента.

например

// 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и т. д. Однако вы можете назначить неотрицательное целочисленное значение. Вы можете даже назначить два значения перечисления одному и тому же целочисленному значению, хотя это, вероятно, не очень хорошая идея. Вы не можете назначить выражение, которое оценивается как целое число.

например

enum Shape {
    None = 5, // valid
    Round, // automatically assigned 6
    Pointy = -1, // not valid
    Bobbly = Round // not valid
    Elusive = (8-7) // not valid
}

Спасибо блогу Михаила Брассера о назначении простых значений.

Во-первых, используйте enum class вместо enum для лучшей безопасности типа

enum class Color { RED, GREEN, BLUE };
Color r = Color::RED;

Затем зарегистрируйте его для Qt, используя Q_ENUMS (использование 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

Начиная с Qt 5.10, вы также можете теперь объявлять типы Enum непосредственно в QML: https://v-play.net/updates/v-play-2-15-0-qt-5-10-qt-creator-4-5-support-firebase-data-structures-and-queries

// 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."
  }
}
Другие вопросы по тегам