mafulechka
mafulechkaНаурыз 26, 2020, 5:18 Т.Ж.

Qt 5.15-те QML түрін тіркеу

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


До сих пор распространенным способом обеспечения доступности типов C++ в QML было использование функций регистрации, представленных в заголовке qqml.h header: qmlRegisterType(), qmlRegisterSingletonType(), qmlRegisterUncreatableType() и т. д. У этого подхода есть свои недостатки:

вы всегда должны держать свои регистрации типов в синхронизации с фактическими типами. Это особенно утомительно, если вы используете ревизии, чтобы сделать свойства доступными в разных версиях импорта. Даже если это не так, тот факт, что вам нужно указывать регистрацию отдельно от типа, является обременительным, поскольку вы можете легко потерять учет того, как вы регистрировали, какие типы в какие модули.

Кроме того, поскольку вы регистрируете свои типы процедурно, любой инструмент QML не может автоматически определить, какие типы доступны в каком импорте. Qt Creator действительно имеет некоторые эвристические методы, которые пытаются обнаружить общие шаблоны регистрации в коде C++, но это является неполным. Выяснение того, будет ли программа выполнять определенную регистрацию, эквивалентно решению проблемы остановки. Более простые инструменты, такие как qmllint или qmlformat, не имеют информации о коде C++ и должны анализировать ваш код QML изолированно. Поэтому у них не будет никакой информации о типах, зарегистрированных в C++. Чтобы (частично) решить эту проблему, были введены файлы "qmltypes". При разработке плагина QML рекомендуется поместить файл с именем "plugins.qmltypes" рядом с двоичным файлом плагина. Файл qmltypes содержит метаинформацию о типах, зарегистрированных плагином. Qt Creator и другие инструменты могут затем обратиться к этой информации, чтобы предоставить вам лучший анализ вашего кода. Это работает, но только для плагинов. Если вы регистрируете свои типы непосредственно из основной программы, вы все еще сталкиваетесь с той же проблемой. Кроме того, вы заканчиваете указанием ваших типов дважды, один раз в C++ и один раз в формате qmltypes. Чтобы (частично) решить проблему избыточной спецификации типа, доступен инструмент под названием "qmlplugindump". Этот инструмент загрузит ваш плагин так же, как и механизм QML. Затем он извлечет информацию обо всех типах, содержащихся в нем, для создания файла plugins.qmltypes. Это также позволит выполнить несвязанный код в вашем плагине, и он будет работать, только если вы компилируете свой плагин для той же платформы, на которой работает qmlplugindump. На практике это не работает для кросс-скомпилированных сборок.

Учитывая все эти камни преткновения, система регистрации типов была переработана в Qt 5.15. Вы не должны больше вызывать qmlRegisterType() и друзей процедурно. Вместо этого набор макросов, которые вы можете добавить в объявления классов, предоставляется в qqml.h. Эти макросы помечают тип как экспортированный в QML. Наиболее важным из них является "QML_ELEMENT". Он предоставляет класс обёртку в QML как элемент, названный именем класса C++. Компилятор мета-объектов (moc) найдет информацию, указанную таким образом. Когда передается параметр "--output-json", он предоставляет файл JSON, который содержит всю информацию метатипа в машинно-независимом и читаемом виде. Вы можете запустить это поведение, указав "CONFIG += metatypes" в вашем файле проекта qmake. Затем новый инструмент с именем "qmltyperegistrar" считывает этот файл метатипов и, возможно, связанные с ним файлы, и генерирует файл C++, содержащий функцию, которая регистрирует все типы, отмеченные соответствующими макросами, а также файл qmltypes только с информацией о типе, релевантной для модуля QML определенной вашим приложением. Для этого ему необходимо знать имя модуля и основную версию. Вы можете указать это в файле проекта qmake, используя переменные QML_IMPORT_NAME" и "QML_IMPORT_MAJOR_VERSION". Минорная версия не указывается. qmltyperegistrar найдет исправленные свойства и методы в данных метатипа и, соответственно, зарегистрирует разные версии типа. Это определяет минорные версии, под которыми доступен модуль. Вы также можете сделать тип доступным из определенной минорной версии, добавив макрос "QML_ADDED_IN_MINOR_VERSION(x)".

Как только система сборки настроена таким образом, вы можете инициировать фактическую регистрацию, добавив "CONFIG += qmltypes". Параметр "qmltypes" CONFIG подразумевает "metatypes". Вам не нужно указывать оба.

Такая статическая регистрация типов C++ для QML будет генерировать не только файлы qmltypes для плагинов, но и для вашего основного приложения. Последние файлы называются "app.qmltypes" и должны быть расположены рядом с двоичным файлом вашего приложения, точно так же, как "plugins.qmltypes" должен быть расположен рядом с плагином, на который он ссылается.

Чтобы проиллюстрировать это, давайте преобразуем приложение, которое динамически регистрирует типы, в приложение, которое статически регистрирует те же типы. Это уже было сделано со всеми примерами QML и QtQuick. Давайте посмотрим на основной пример "Adding Types" ("Добавление типов"). В Qt 5.14 и ранее у примера была следующая строка кода в файле main.cpp:

qmlRegisterType<Person>("People", 1,0, "Person");

Это позволит зарегистрировать C++ class "Person" в качестве элемента QML, также называемого "Person", в модуле "People" в версии 1.0. Эта строка исчезла в Qt 5.15. Вместо этого в файл adding.pro были добавлены следующие строки:

CONFIG += qmltypes
QML_IMPORT_NAME = People
QML_IMPORT_MAJOR_VERSION = 1

Эти строки указывают имя импорта и основную версию для всех типов, представленных в QML. Наконец, наиболее важным изменением является макрос "QML_ELEMENT", добавленный в файл person.h:

class Person : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName)
    Q_PROPERTY(int shoeSize READ shoeSize WRITE setShoeSize)
    QML_ELEMENT
public:
    Person(QObject *parent = nullptr);
    [...]
};

Этот "QML_ELEMENT" указывает qmltyperegistrar, чтобы зарегистрировать тип. Это все. Теперь вы можете указать столько "QML_ELEMENT", сколько захотите, каждый раз не набирая имя импорта версии и ревизии.

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

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

BlinCT
  • Наурыз 26, 2020, 10:50 Т.Ж.

У меня вот возник вопрос, как понимаю adding.pro дял добавления макросов это проектный файл?
А есть проект использует cmake, как там с этим обстоит?

Evgenii Legotckoi
  • Наурыз 27, 2020, 4:36 Т.Ж.

Скорее всего также, как и для установки всех остальных переменых в CMake, через использование set

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
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,>…

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