Evgenii Legotckoi
Жел. 15, 2017, 3:02 Т.Қ.

QML - Сабақ 035. C++ қолданбай QML тілінде сандарды пайдалану

Мазмұны

Ну вот наконец-то и дождались!!! Появилась возможность объявлять перечисления (enum) сразу в QML без плясок с C++. Как добавлять свои перечисления в QML через C++ я описывал вот в этой статье . По факту здесь нет ничего сложного со стороны C++, просто нужно написать класс, наследованный от QObject, да зарегистрировать через Q_ENUM или Q_ENUMS ваше перечисление в этом классе, да зарегистрировать класс через qmlRegisterType.

Q_ENUM был добавлен в Qt 5.5 для замены Q_ENUMS , и он позволяет получить QMetaEnum во время компиляции с использованием QMetaEnum::fromType . Такие перечисления теперь автоматически регистрируются как метатипы и могут быть преобразованы в строки в QVariant или напечатаны как строка с помощью qDebug().

Однако по моим наблюдениям при регистрации перечислений через Q_ENUM в файлах QML в Qt Creator не работает автодополнение кода для этих перечислений, тогда как при регистрации через Q_ENUMS всё работает.

Но теперь можно написать перечисление сразу в вашем пользовательском типе QML.

Например создадим вот такой тип объекта в QML.

MyText.qml

  1. import QtQuick 2.10
  2.  
  3. Text {
  4. enum MyEnum {
  5. First = 10,
  6. Second
  7. }
  8.  
  9. anchors.centerIn: parent
  10. }

Тогда в main.qml его можно будет использовать следующим образом

main.qml

  1. import QtQuick 2.10
  2. import QtQuick.Window 2.10
  3.  
  4. Window {
  5. visible: true
  6. width: 640
  7. height: 480
  8. title: qsTr("Hello World")
  9.  
  10. MyText {
  11. text: MyText.MyEnum.Second
  12. }
  13. }

На экране будет выведено число 11

Как видите синтаксис обращения к перечислению будет следующий.

<Имя типа объекта QML> . <Имя перечисления> . <Имя участника перечисления>

Причём не важно, внутри типа вы используете это перечисление или вне его. То есть использование внутри типа этого перечисления будет выглядеть следующим образом.

  1. import QtQuick 2.10
  2.  
  3. Text {
  4. enum MyEnum {
  5. First = 10,
  6. Second
  7. }
  8.  
  9. anchors.centerIn: parent
  10. text: MyText.MyEnum.Second
  11. }

ВНИМАНИЕ!!! - следующий вариант не заработает

  1. import QtQuick 2.10
  2.  
  3. Text {
  4. enum MyEnum {
  5. First = 10,
  6. Second
  7. }
  8.  
  9. anchors.centerIn: parent
  10. text: MyEnum.Second
  11. }

То есть даже внутри кастомного типа нужно обращаться к перечислению этого типа через его имя, то есть название файла QML.

Обращаю ваше внимание, что с точки зрения организации программ на QML, каждый файл QML является типом QML, то есть самодостаточным объектом, который в иерархии наследования будет на уровне C++ наследован от QObject класса.

Также, к сожалению, ещё не поддерживаются следующие варианты объявления перечислений.

  1. enum MyEnum {
  2. First = -1,
  3. Second
  4. }
  5.  
  6. enum MySecondEnum {
  7. First,
  8. Second = First
  9. }

Помимо прочего в актуальном на момент написания статьи Qt Creator 4.5.0 ещё не поддерживается подсветка синтаксиса enum в QML. Однако сами перечисления работают.

Осы тақырып бойынша ұсынылатын мақалалар

Мақала бойынша сұралады0сұрақтар(лар)

2

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

m
  • Маусым 20, 2022, 6:26 Т.Қ.

А как правильно зарегистрировать C++ enum, допустим

  1. enum CppEnumType {
  2. Foo,
  3. Bar
  4. };

чтобы использовать его в QML как

  1. property CppEnumType: CppEnumType.Foo

У меня никак не получается тип проперти сделать enum из C++, только как int

Evgenii Legotckoi
  • Маусым 21, 2022, 1:09 Т.Қ.

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз