Evgenii Legotckoi
Evgenii LegotckoiЖел. 15, 2017, 4: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

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. Однако сами перечисления работают.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

m
  • Маусым 20, 2022, 8:26 Т.Ж.

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

enum CppEnumType {
 Foo,
 Bar
};

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

property CppEnumType: CppEnumType.Foo

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

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 6:38 Т.Ж.

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз