Коммит c368ae4b создал по автору lagutinakv's avatar lagutinakv Зафиксировано автором evseev84
Просмотр файлов

Update materials about Qt object model

владелец 012c32cf
Это отличие свёрнуто
# Система сборки CMake
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Система CMake
CMake - это инструмент, упрощающий процесс сборки для проектов разработки на разных платформах.
CMake формирует состав компонентов и файлов, входящих в проект, необходимых для создания приложения.
С Qt 5 можно использовать версии CMake до 3.1.0 включительно.
CMake автоматизирует настройку систем сборки. Он контролирует процесс компиляции программного
обеспечения с помощью простых файлов конфигурации, называемых файлами CMakeLists.txt.
CMake генерирует собственные конфигурации сборки и рабочие области, которые можно использовать
в среде компилятора по вашему выбору.
Qt Creator автоматически запускает CMake для обновления информации о проекте, когда вы редактируете
файл конфигурации CMakeLists.txt в проекте.
Информация о проекте также автоматически обновляется при сборке проекта.
## Пример CMakeLists.txt
Пример CMakeLists.txt для ОС Аврора.
В примере на слайде пропущено несколько строчек с функциями install, которые отвечают за установку
ресурсов приложения: файлов qml, переводов и т.п. в конкретные директории в ОС Аврора.
С полным кодом примера можно познакомиться самостоятельно, создав новый проект в Аврора IDE.
## CMakeLists.txt
В project указывется имя проекта, например, my_cmake_project.
cmake_minimum_required указывает необходимую минимальную версию cmake.
Одной из основных функций является `find_package`.
Она позволяет найти библиотеки и файлы заголовков, поставляемые с Qt.
Затем вы можете использовать эти библиотеки и файлы заголовков с командой `target_link_libraries`
для создания библиотек и приложений на основе Qt.
pkg_search_module использует инструмент pkg-config для определения местоположения запрошенной библиотеки.
В данном случае это библиотека auroraapp, необходимая Аврора-приложениям.
Параметр CMAKE_AUTOMOC запускает компилятор moc автоматически при необходимости.
Параметр add_executable указывает на заголовочные и cpp-файлы проекта.
Параметр add_custom_target - на другие файлы проекта.
Параметр files сообщает IDE, где исполняемые файлы приложения будут расположены на устройстве.
# Тесты по теме «Система сборки CMake»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Matching
Сопоставьте параметры CMake и их функциональность.
---
| | |
|---------|--------------------------|
| pkg_search_module | Поиск запрашиваемой библиотеки |
| add_executable | Список h-файлов и cpp-файлов |
| project | Имя проекта |
## Text
Как называется конфигурационный файл проекта для сборки, если используется инструмент CMake?
---
CMakeLists.txt
Это отличие свёрнуто
# Подключение ресурсов и библиотек
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Переменные модулей
Модули Qt, загруженные с помощью find_package, устанавливают различные переменные.
Примеры переменных:
* Qt5Core_FOUND - Логическое значение, которое описывает, был ли модуль найден успешно.
* Qt5Core_LIBRARIES - Имя импортированной цели для модуля: Qt5::Core.
* Qt5Core_INCLUDE_DIRS - Список подключаемых каталогов для использования при сборке с библиотекой.
* Qt5Core_VERSION_STRING - Строка, содержащая версию модуля.
Для всех пакетов, найденных с помощью find_package, доступны эквиваленты этих переменных;
они чувствительны к регистру.
Вам редко нужен прямой доступ к этим переменным.
Общие задачи, такие как связывание с модулем, должны выполняться через цели библиотек, которые определяет каждый модуль.
## Команды cmake для Qt5::Core
* qt5_add_big_resources - компилирует большие двоичные ресурсы в объектный код.
* qt5_add_binary_resources - создаёт файл RCC из списка файлов ресурсов Qt.
* qt5_add_resources - компилирует двоичные ресурсы в исходный код.
* qt5_generate_moc - вызывает moc для входного файла.
* qt5_import_plugins - задаёт настраиваемый набор подключаемых модулей для импорта для статической сборки Qt.
* qt5_wrap_cpp - создаёт файлы .moc из источников.
# Примеры по теме «Объектная модель Qt»
# Тесты по теме «Подключение ресурсов и библиотек»
Copyright © 2016–2023 ООО «Открытая мобильная платформа».
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
* [Счётчик для Аврора IDE](../../projects/counter_aurora)
* [Счётчик для Qt Creator](../../projects/counter_qtcreator)
## Multiple choice
С помощью каких функций cmake можно управлять модулями Qt и библиотеками?
---
* cmake_minimum_required
* **find_package**
* **pkg_search_module**
* add_executable
Это отличие свёрнуто
# Аргументы командной строки
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Аргументы для приложения в точке входа
Механизм работы с аргументами приложения в ОС Аврора аналогичен стандартному способу передачи аргументов в C++-приложение.
argc (количество аргументов) и argv (значения аргументов) являются аргументами основной функции main.
Из основной функции они передаются в конструктор QGuiApplication (для приложений с графическим интерфейсом) или QCoreApplication (для консольных приложений).
Далее список аргументов можно получить через метод arguments() и обработать самостоятельно.
## Пример desktop-файла
Для приложения аргументы командной строки можно задать, например, в desktop-файле,
в поле `Exec` в основном разделе `[Desktop Entry]`,
или для запуска через D-Bus в поле `ExecDBus` раздела `[X-Application]`.
В данном случае `/usr/bin/ru.auroraos.MyApp` — это путь к исполняемому файлу приложения.
Приложение может быть запущено тапом по иконке в меню приложений, тогда выполнится команда из `Exec`
с аргументом `--my-arg`.
Также приложение может быть запущено через D-Bus с другим аргументом, `--my-other-arg`.
# Тесты по теме «Аргументы командной строки»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Single choice
Какому Qt-классу рекомендуется передать аргументы командной строки?
---
* **QGuiApplication или его наследнику**
* QObject
## Text
В каком поле desktop файла можно указать, с какими аргументами будет запущено приложение по нажатию на иконку?
---
Exec
......@@ -336,13 +336,52 @@ Copyright © 2016–2025 ООО «Открытая мобильн
[конспект](./qt_quick_controls_2/lecture.md)
* [Задания](./qt_quick_controls_2/tasks.md)
* [Тесты](./qt_quick_controls_2/tests.md)
* [Объектная модель Qt](./qt_object_model)
* Лекция:
[cлайды](./qt_object_model/lecture.fodp),
[конспект](./qt_object_model/lecture.md)
* [Примеры](./qt_object_model/examples.md)
* [Задания](./qt_object_model/tasks.md)
* [Тесты](./qt_object_model/tests.md)
* Основы разработки на Qt/C++
* [Объектная модель Qt](./qt_object_model)
* Лекция:
[cлайды](./qt_object_model/lecture.fodp),
[конспект](./qt_object_model/lecture.md)
* [Тесты](./qt_object_model/tests.md)
* [Moc и макросы](./moc_macro)
* Лекция:
[cлайды](./moc_macro/lecture.fodp),
[конспект](./moc_macro/lecture.md)
* [Тесты](./moc_macro/tests.md)
* [Qt Application и цикл событий](./qt_application)
* Лекция:
[cлайды](./qt_application/lecture.fodp),
[конспект](./qt_application/lecture.md)
* [Тесты](./qt_application/tests.md)
* [Аргументы командной строки](./command_line_arguments)
* Лекция:
[cлайды](./command_line_arguments/lecture.fodp),
[конспект](./command_line_arguments/lecture.md)
* [Тесты](./command_line_arguments/tests.md)
* [Ручной запуск с UI или без него](./start_ui)
* Лекция:
[cлайды](./start_ui/lecture.fodp),
[конспект](./start_ui/lecture.md)
* [Тесты](./start_ui/tests.md)
* [Libauroraapp](./libauroraapp)
* Лекция:
[cлайды](./libauroraapp/lecture.fodp),
[конспект](./libauroraapp/lecture.md)
* [Тесты](./libauroraapp/tests.md)
* [QObject, сигналы и слоты](./cpp_signals_and_slots)
* Лекция:
[cлайды](./cpp_signals_and_slots/lecture.fodp),
[конспект](./cpp_signals_and_slots/lecture.md)
* [Тесты](./cpp_signals_and_slots/tests.md)
* [Система сборки CMake](./cmake_base)
* Лекция:
[cлайды](./cmake_base/lecture.fodp),
[конспект](./cmake_base/lecture.md)
* [Тесты](./cmake_base/tests.md)
* [Подключение ресурсов и библиотек](./cmake_resources)
* Лекция:
[cлайды](./cmake_resources/lecture.fodp),
[конспект](./cmake_resources/lecture.md)
* [Тесты](./cmake_resources/tests.md)
* [Жизненный цикл приложения в ОС Аврора](./aurora_app_lifecycle)
* Лекция:
[cлайды](./aurora_app_lifecycle/lecture.fodp),
......
Это отличие свёрнуто
# QObject, сигналы и слоты
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## QObject
В основе объектной модели Qt лежит класс QObject.
QObject является единым базовым классом для большинства классов Qt.
Ключевой особенностью объектной модели Qt является механизм общения между объектами,
называемый сигналы и слоты.
Данный механизм доступен для всех наследников класса QObject.
Классы, производные от QObject являются источником информации для системы мета-объектов.
Наличие макроса Q_OBJECT включает поддержку данной системы для объектов.
Мета-объектный компилятор moc предоставляет каждому подклассу QObject код для реализации
мета-объектных возможностей.
## Расширение C++ классов
Для корректного функционирования системы объектов каждый наследник QObject должен содержать
в теле класса макрос Q_OBJECT.
Важным ограничением Qt-объектов является запрет на копирование.
Наследники QObject не имеют конструктора копирования и оператора копирующего присваивания,
так что могут передаваться лишь по ссылке.
Информация о классе объекта может быть получена через систему метаобъектов.
Все объекты одного типа разделяют единый метаобъект с описанием их класса, который предоставляет
информацию об имени класса, реализуемых методах и свойствах.
Данная информация генерируется автоматически с помощью компилятора мета-объектов moc.
На слайде изображен простейший пример класса, наследуемого от QObject.
Класс имеет одно приватное поле, конструктор, один публичный метод, один слог и один сигнал.
Объявление класса описывается в .h-файле, реализация конструктора и методов — в .cpp-файле.
## Структура объявления класса
Структура объявления класса представлена на слайде.
Сначала указываются макросы, затем идут публичные и приватные блоки.
Для сигналов и слотов добавляются отдельные блоки.
## Сигналы и слоты
Взаимодействие объектов осуществляется с помощью механизма сигналов и слотов.
Сигналы, поддерживаемые объектом, объявляются в теле определения Qt-класса аналогично остальным методам.
Объявления сигналов размещаются в специальной секции signals.
Сигналы являются открытыми функциями, а их реализация генерируется компилятором метаобъектов.
Сигналы не должны возвращать каких-либо значений.
Рекомендуется предварять вызов сигнала словом emit, которое не имеет никакого функционального значения,
но делает код нагляднее.
Слоты объявляются так же как и обычные функции.
В отличие от сигналов, программист должен предоставить определения данных функций.
Объявления слотов располагаются в секции public slots.
Слоты могут использоваться как обычные функции.
На слайде приведен пример объявления сигнала textChanged() и слота printText().
## Подключение и испускание сигналов
Подключение слота к сигналу происходит с помощью метода connect() класса QObject.
Первый аргумент метода – указатель на объект-отправитель, который будет генерировать сигналы.
Второй аргумент должен указывать на сигнал, для которого осуществляется подключение.
Сигнал оборачивается в макрос SIGNAL.
Третий аргумент – указатель на объект-получатель, слот которого будет вызван при обработке сигнала.
Четвертый аргумент указывает на слот только теперь получателя.
Слот оборачивается в макрос SLOT.
На слайде два примера подключения сигнала к слоту.
В первом создается объект и с помощью метода connect() его собственный сигнал соединяется с его собственным слотом.
Во втором примере создаются два объекта.
Сигнал первого объекта соединяется со слотом второго.
Здесь приведены два эквивалентных описания соединения сигнала и слота.
В одном случае используется статическая функция connect(), где явно указываются все 4 аргумента.
Во втором случае используется метод вызванный на объекте.
В этом случае не нужно указывать объект-получатель сигнала, т.к. на нем и вызывается метод connect().
Все остальные параметры описываются ровно так же.
Для отключения сигнала от слота используется QObject::disconnect().
Эта функция использует те же аргументы, что и connect().
На слайде изображены примеры отключения слотов от сигналов.
Здесь есть отключение всех объектов от всех сигналов объекта-отправителя.
Для этого необходимо в качестве всех аргументов, кроме первого указать нули.
И эквивалентный вызов метода disconnect() на объекте отправителе сигналов, от которого нужно отключиться.
Далее описан вариант с отключением всех объектов от одного конкретного сигнала объекта-отправителя.
Здесь только последние два параметра указываются как 0, а объект-отправитель и его сигнал описываются.
И эквивалентный вызов метода disconnect() на объекте-отправителе с передаче в качестве аргумента
сигнал, от которого нужно отключиться.
А также пример с отключением объекта-получателя от всех сигналов объекта-отправителя.
В этом случае нули указываются на местах аргументов SIGNAL и SLOT.
И ниже эквивалентный вызов метода disconnect() на объекте-отправителе сигналов, куда в качестве
аргумента передается указатель на объект-получатель.
Отправка сигнала происходит с помощью ключевого слова emit.
Для сигнала задается только прототип, причем сигнал не может возвращать значение (т.е., указывается void).
За реализацию отвечает компилятор метаобъектов.
# Тесты по теме «QObject, сигналы и слоты»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Multiple choice
Что из перечисленного является необходимым для того, чтобы объекту был доступен механизм сигналов и слотов?
---
* **Наличие макроса Q_OBJECT**
* Наличие макроса Q_INVOKABLE
* **Наследование от QObject**
## Single choice
Возможно ли соединить сигнал с сигналом напрямую?
---
* Можно только с использованием слота
* Нет
* **Да**
## Single choice
Способен ли объект присоединять к своим слотам свои же сигналы?
---
* **Да**
* Нет
## Single choice
Можно ли подключить сигнал к сигналу?
---
* **да**
* нет
## Single choice
Выберите НЕВЕРНОЕ утверждение о макросе Q_OBJECT:
---
* **Макрос Q_OBJECT обязательно должен появляться в разделе public класса**
* Макрос Q_OBJECT требует, чтобы класс, в котором он появляется, был производным от QObject
* Макрос Q_OBJECT обязателен для классов, использующих механизм сигналов и слотов
## Single choice
С помощью механизма сигналов и слотов НЕВОЗМОЖНО:
---
* Подсоединить сигнал с параметром к слоту без параметра, например, connect(slider, SIGNAL(valueChanged(int)), spinbox, SLOT(update()));
* **Подсоединить сигнал без параметра к слоту с параметром, например, connect(slider, SIGNAL(updated()), spinbox, SLOT(valueChanged(int)));**
* Осуществить соединение сигнал-сигнал
Это отличие свёрнуто
# Libauroraapp
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Библиотека Libauroraapp
При разработке приложений под ОС Аврора следует использовать библиотеку libauroraapp, которая предоставляет API для инициализации приложения и получения корректных путей к файлам и директориям приложения во время его работы.
При создании приложения из шаблона библиотека будет сразу подключена.
Для подключения libauroraapp в проекте необходимо выполнить следующие шаги:
Добавить BuildRequires: pkgconfig(auroraapp) в файл .spec.
Добавить PKGCONFIG += auroraapp в файл .pro.
Или добавить pkg_search_module(AURORA auroraapp REQUIRED) в CMakeLists.txt.
Включить auroraapp.h в файл .cpp.
## Стартовая точка Аврора-приложения
На слайде представлен код стартовой точки Аврора-приложения.
application() создаёт новый экземпляр QGuiApplication, который сконфигурирован для использования в ОС Аврора.
createView() создаёт новый экземпляр QQuickView, который приложение может использовать для отображения пользовательского интерфейса.
QQuickView можно использовать, например, для установки корневой страницы QML, которая будет отображаться приложением.
pathTo(const QString &filename) преобразует относительный путь к ресурсу в полный путь, специфичный для приложения.
Используется для получения полного пути к файлу, содержащемуся в каталоге данных приложения.
Параметр filename должен указывать на файл относительно каталога данных приложения.
Возвращённый URL-адрес будет полным путём, указывающим на файл.
## pathToMainQml
pathToMainQml() возвращает путь к файлу QML, используемому в качестве корня пользовательского интерфейса приложения.
Эта функция используется для получения в локальной файловой системе пути к файлу QML, который открывается при запуске приложения, и который будет формировать корень всех других файлов QML, отображаемых приложением.
Файл должен содержать тип ApplicationWindow, который ссылается на начальную страницу приложения, и обложку, которая будет использоваться на экране приложения.
# Тесты по теме «Libauroraapp»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Matching
Сопоставьте методы Libauroraapp и их функциональность.
---
| | |
|---------|--------------------------|
| application | Создаёт QGuiApplication, сконфигурированный для ОС Аврора |
| createView | Создаёт QQuickView |
| pathToMainQml | Возвращает путь к корневому файлу QML |
| pathTo | Возвращает полный путь к файлу |
Это отличие свёрнуто
# Moc и макросы
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Метаобъектная система Qt
Система мета-объектов позволяет функционировать механизму сигналов и слотов, системе свойств
и является источником информации о типах данных во время исполнения.
Классы, производные от QObject являются источником информации для системы мета-объектов.
Наличие макроса Q_OBJECT включает поддержку данной системы для объектов.
## Инструмент moc
Мета-объектный компилятор moc предоставляет каждому подклассу QObject код для реализации мета-объектных возможностей.
Макрос в C++ — это действие или набор действий, которые можно выполнять сколько угодно раз.
Основным макросом метаобъектной системы Qt является Q_OBJECT.
Инструмент moc читает файл исходных кодов C++.
Если он находит один или более объявлений классов, содержащих макрос Q_OBJECT, он производит
другой файл исходных кодов C++, который содержит мета-объектный код для каждого из этих классов.
Полученный файл исходных кодов или подключается с помощью #include в исходном файле класса или,
что применяется чаще, компилируется и линкуется вместе с реализацией класса.
## Возможности метаобъектной системы
Помимо предоставления механизма сигналов и слотов для взаимодействия между объектами (основная причина введения этой системы), метаобъектный код предоставляет следующие дополнительные возможности:
* QObject::metaObject() возвращает связанный метаобъект для класса.
* QMetaObject::className() возвращает имя класса в виде строки во время выполнения, не требуя поддержки встроенной информации о типах во время выполнения (RTTI) через компилятор C++.
* Функция QObject::inherits() возвращает, является ли объект экземпляром класса, наследующего указанный класс в дереве наследования QObject.
* QObject::tr() и QObject::trUtf8() преобразуют строки для интернационализации.
* QObject::setProperty() и QObject::property() динамически устанавливают и получают свойства по имени.
* QMetaObject::newInstance() создаёт новый экземпляр класса.
# Тесты по теме «Moc и макросы»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Text
Какой макрос основной в метаобъектной системе Qt?
---
Q_OBJECT
## Multiple choice
Какие возможности предоставляет метаобъектная система Qt?
---
* **Сингалы и слоты**
* **Свойства**
* Динамическая типизация
* Умные указатели
Это отличие свёрнуто
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать