6.8 KiB
main.cpp — точка входа
Обзор
Minecraft_launcher — десктопный лаунчер Minecraft на Qt 6 Quick. Интерфейс написан на QML,
вся работа — авторизация, скачивание версий, установка модлоадеров и Java, запуск игры — лежит в
C++-классе LauncherBackend и его сервисах.
main.cpp — стартовая последовательность приложения: здесь при необходимости инициализируется
Qt WebEngine, создаётся объект приложения, читается каталог переводов, выбирается стиль
Qt Quick Controls, загружается QML-модуль и запускается цикл событий. Файл намеренно короткий:
ни одного объекта предметной области он не создаёт — всё, что нужно, QML заводит сам.
Настройка приложения Qt
Создаётся QGuiApplication — не QApplication: интерфейс целиком на Qt Quick, виджеты не
используются, и модуль Qt Widgets в проект не подключён.
До создания приложения, при сборке с Qt WebEngine, вызывается QtWebEngineQuick::initialize().
Порядок здесь принципиален: инициализация выставляет общий контекст OpenGL, а после создания
объекта приложения это уже не действует. Вызов обёрнут в условную компиляцию по макросу
LAUNCHER_HAS_WEBENGINE.
Каталог переводов
Сразу после создания приложения вызывается Localization::instance().load() — он читает
i18n/translations.json из ресурсов и определяет язык интерфейса. Порядок важен: язык нужно
знать до того, как QML вычислит первую привязку, а LauncherBackend,
который ведёт settings.json, появляется только вместе с движком — поэтому ключ language
Localization читает из файла сам.
Неудача — не повод продолжать: каталог вкомпилирован в бинарник, значит его отсутствие или
поломка означают ошибку сборки. main() пишет причину и возвращает -1.
Стиль Qt Quick Controls
Стиль Qt Quick Controls принудительно выставляется в Basic
вызовом QQuickStyle::setStyle(). Причина в оформлении: всё окно лаунчера стилизовано вручную, а
нативный стиль Windows игнорирует пользовательские contentItem и background и сыплет
предупреждениями.
Обработка командной строки
Аргументы командной строки не разбираются: argc и argv передаются в конструктор
QGuiApplication и дальше не используются. Ни QCommandLineParser, ни собственного разбора в
файле нет.
Создание объектов верхнего уровня
В main() создаётся ровно два объекта.
| Объект | Тип | Роль |
|---|---|---|
app |
QGuiApplication |
объект приложения и цикл событий |
engine |
QQmlApplicationEngine |
загружает и исполняет QML-модуль лаунчера |
Экземпляр LauncherBackend здесь не создаётся: тип зарегистрирован через QML_ELEMENT, и главное
окно объявляет его само декларативно. Поэтому в main.cpp нет ни одного #include классов
предметной области.
Связывание и подключения
Единственное подключение — обработка неудачи создания корневого объекта: сигнал
QQmlApplicationEngine::objectCreationFailed замыкается на лямбду, которая завершает приложение
с кодом -1. Соединение создаётся с типом Qt::QueuedConnection и с объектом app в роли
контекста, чтобы выход из приложения происходил уже внутри цикла событий, а не в разгар загрузки
QML.
Контекстные свойства не задаются, начальные свойства корневому объекту не передаются: связь между QML и C++ идёт исключительно через зарегистрированный тип.
Цикл событий
QML загружается вызовом engine.loadFromModule("Minecraft_launcher", "Main") — по URI модуля и
имени типа, а не по пути к файлу. Модуль объявлен в CMakeLists.txt через qt_add_qml_module, а
Main — это Main.qml, корневой элемент которого Window с visible: true,
поэтому окно показывается само.
Цикл событий запускается app.exec(), его результат возвращается из main() как код завершения
процесса.
Зависимости
| Заголовок | Что даёт |
|---|---|
QGuiApplication |
объект приложения и цикл событий для приложения без виджетов |
QQmlApplicationEngine |
загрузка QML-модуля и создание корневого объекта |
QQuickStyle |
выбор стиля Qt Quick Controls до загрузки QML |
QtWebEngineQuick |
инициализация WebEngine; подключается только при сборке с Qt WebEngine |
Модули сборки: Qt6::Quick, Qt6::QuickControls2, Qt6::Core, Qt6::CorePrivate, Qt6::Gui,
Qt6::Network и опционально Qt6::WebEngineQuick. Макрос LAUNCHER_HAS_WEBENGINE определяется в
CMakeLists.txt только тогда, когда find_package нашёл Qt6WebEngineQuick.
При создании этого документа использовался ИИ.