- 1. MyText.qml
- 2. main.qml
Ну вот наконец-то и дождались!!! Появилась возможность объявлять перечисления (enum) сразу в QML без плясок с C++. Как добавлять свои перечисления в QML через C++ я описывал вот в этой статье . По факту здесь нет ничего сложного со стороны C++, просто нужно написать класс, наследованный от QObject, да зарегистрировать через Q_ENUM или Q_ENUMS ваше перечисление в этом классе, да зарегистрировать класс через qmlRegisterType.
Q_ENUM
был добавлен в Qt 5.5 для замены
Q_ENUMS
, и он позволяет получить
QMetaEnum
во время компиляции с использованием
QMetaEnum::fromType
Однако по моим наблюдениям при регистрации перечислений через Q_ENUM в файлах QML в Qt Creator не работает автодополнение кода для этих перечислений, тогда как при регистрации через Q_ENUMS всё работает.
Но теперь можно написать перечисление сразу в вашем пользовательском типе QML.
Например создадим вот такой тип объекта в QML.
MyText.qml
- import QtQuick 2.10
- Text {
- enum MyEnum {
- First = 10,
- Second
- }
- anchors.centerIn: parent
- }
Тогда в main.qml его можно будет использовать следующим образом
main.qml
- import QtQuick 2.10
- import QtQuick.Window 2.10
- Window {
- visible: true
- width: 640
- height: 480
- title: qsTr("Hello World")
- MyText {
- text: MyText.MyEnum.Second
- }
- }
На экране будет выведено число 11
Как видите синтаксис обращения к перечислению будет следующий.
<Имя типа объекта QML> . <Имя перечисления> . <Имя участника перечисления>
Причём не важно, внутри типа вы используете это перечисление или вне его. То есть использование внутри типа этого перечисления будет выглядеть следующим образом.
- import QtQuick 2.10
- Text {
- enum MyEnum {
- First = 10,
- Second
- }
- anchors.centerIn: parent
- text: MyText.MyEnum.Second
- }
ВНИМАНИЕ!!! - следующий вариант не заработает
- import QtQuick 2.10
- Text {
- enum MyEnum {
- First = 10,
- Second
- }
- anchors.centerIn: parent
- text: MyEnum.Second
- }
То есть даже внутри кастомного типа нужно обращаться к перечислению этого типа через его имя, то есть название файла QML.
Обращаю ваше внимание, что с точки зрения организации программ на QML, каждый файл QML является типом QML, то есть самодостаточным объектом, который в иерархии наследования будет на уровне C++ наследован от QObject класса.
Также, к сожалению, ещё не поддерживаются следующие варианты объявления перечислений.
- enum MyEnum {
- First = -1,
- Second
- }
- enum MySecondEnum {
- First,
- Second = First
- }
Помимо прочего в актуальном на момент написания статьи Qt Creator 4.5.0 ещё не поддерживается подсветка синтаксиса enum в QML. Однако сами перечисления работают.
А как правильно зарегистрировать C++ enum, допустим
чтобы использовать его в QML как
У меня никак не получается тип проперти сделать enum из C++, только как int
QML - Урок 028. Регистрация пользовательских enum в QML