Розбираємося у 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 у середовищах, відмінних від Плазми, зокрема у 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, оскільки для нашої програми ми використали QApplication замість QGuiApplication . Справжні елементи керування інтерфейсу у вікні, зокрема кнопки і пункти, використовуватимуть Breeze через використання qqc2-desktop-style.

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

Далі, ми перевіримо, чи наш рушій належним чином завантажив файл QML, перевіривши, чи список rootObjects() рушія є порожнім. Далі, ми можемо запустити нашу програму за допомогою app.exec() .