Как мы можем сделать объявление перечисления только в 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."
}
}