- 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