Skip to main content
Перейти к содержимому

Разбор main.cpp

Понимание центрального файла кода бэкенда

Роль main.cpp

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

Здесь будет рассмотрен файл main.cpp, созданный на странице Начало работы, чтобы лучше понять, что происходит в центральном файле C++ приложения. Хотя этот main.cpp — базовый, рассматриваемые возможности останутся необходимыми независимо от того, какое приложение будет создано.

Назначение

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include <QUrl>
#include <QQuickStyle>
#include <KLocalizedContext>
#include <KLocalizedString>
#include <KIconTheme>

int main(int argc, char *argv[])
{
    KIconTheme::initTheme();
    QApplication app(argc, argv);
    KLocalizedString::setApplicationDomain("tutorial");
    QApplication::setOrganizationName(QStringLiteral("KDE"));
    QApplication::setOrganizationDomain(QStringLiteral("kde.org"));
    QApplication::setApplicationName(QStringLiteral("Kirigami Tutorial"));
    QApplication::setDesktopFileName(QStringLiteral("org.kde.tutorial"));

    QApplication::setStyle(QStringLiteral("breeze"));
    if (qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE")) {
        QQuickStyle::setStyle(QStringLiteral("org.kde.desktop"));
    }

    QQmlApplicationEngine engine;

    engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
    engine.loadFromModule("org.kde.tutorial", "Main");

    if (engine.rootObjects().isEmpty()) {
        return -1;
    }

    return app.exec();
}

Сначала нужно включить ряд заголовочных файлов Qt, позволяющих использовать их функции. В данном случае включается ряд заголовков Qt, отвечающих за логику приложения, а также позволяющих читать файлы QML.

Затем создаётся экземпляр QApplication, которому присваивается имя app. Для вызова конструктора требуется передать argc и argv.

Также задаются некоторые метаданные, относящиеся к приложению. К ним относятся организация, создавшая приложение, веб-сайт организации и название приложения. Эти свойства задаются вызовом QApplication, при котором создаётся объект, происходящий от QCoreApplication и предоставляющий приложениям цикл обработки событий независимо от того, есть ли у них графический интерфейс (поэтому если программа запущена без графического интерфейса, эти метаданные всё равно будут заданы).

Чтобы приложение хорошо выглядело со значками Breeze и оформлением Breeze от KDE в средах, отличных от Plasma, таких как Windows или GNOME, нужно выполнить три действия:

  • Инициализируйте средства работы с темами из KIconThemes на платформах, где темы значков не входят в состав системы (например, Windows или MacOS), с помощью KIconTheme::initTheme()
  • Задайте QStyle с помощью QApplication::setStyle(), чтобы принудительно использовать Breeze вместо встроенного оформления платформы
  • Задайте стиль QtQuick Controls с помощью QQuickStyle::setStyle(), чтобы принудительно использовать Breeze с qqc2-desktop-style из KDE

Вызов KIconTheme::initTheme() необходимо выполнить до создания QApplication — это позволяет приложению найти значки Breeze для использования. Установка QStyle в Breeze требуется, поскольку в приложении вместо QGuiApplication используется QApplication. Сами элементы управления в окне, такие как кнопки и флажки, будут следовать Breeze благодаря использованию qqc2-desktop-style.

QQmlApplicationEngine позволяет загрузить приложение из файла QML, что и делается в следующей строке. В engine.loadFromModule("org.kde.tutorial", "Main"); QML загружается из импорта URI, определённого в CMake.

Далее проверяется, правильно ли движок загрузил файл QML: список rootObjects() движка должен быть не пуст. После этого приложение можно запустить с помощью app.exec().