- 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