Rozumienie main.cpp

Zrozumienie głównego pliku naszego kodu silnika

Rola main.cpp

Podczas gdy QML używa się do front-endu aplikacji Kirigami, to backend zazwyczaj jest napisany w C++ dzięki szybkości i elastyczności tego języka. W poprzednich rozdziałach wyjaśnialiśmy szczegóły QML, a teraz będziemy musieli zrozumieć kod w C++ naszego backendu, aby uczynić nasze aplikacje bardziej użytecznymi, poza to co można osiągną przy użyciu czystego QML.

Tutaj, przejdziemy przez plik main.cpp, który utworzyliśmy na stronie ‘Pierwszych korków’ tak, abyśmy mogli lepiej zrozumieć, co się dzieje w głównym pliku C++ naszej aplikacji. Mimo, że jest to podstawowy main.cpp, to zawarte w nim rzeczy są istotne, niezależnie od rodzaju aplikacji, którą postanowisz stworzyć.

Co to robi

 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
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include <QUrl>
#include <KLocalizedContext>
#include <KLocalizedString>

int main(int argc, char *argv[])
{
    QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);
    KLocalizedString::setApplicationDomain(QStringLiteral("helloworld"));
    QCoreApplication::setOrganizationName(QStringLiteral("KDE"));
    QCoreApplication::setOrganizationDomain(QStringLiteral("kde.org"));
    QCoreApplication::setApplicationName(QStringLiteral("Hello World"));

    QQmlApplicationEngine engine;

    engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

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

    return app.exec();
}

Najpierw musimy dołączyć kilka plików nagłówkowych Qt, co umożliwi nam użycie zawartych w nich funkcji. W tym przypadku, dołączamy kilka nagłówków Qt, które obsługują logikę aplikacji, odczytywanie plików QML oraz dostęp do plików określonych w resources.qrc.

Wejdź do swojej głównej funkcji. Jej pierwszy wiersz QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); włącza skalowanie do wysokiego DPI. Umożliwia to twoim aplikacjom poprawne przeskalowanie się na urządzeniach o różnej gęstości pikseli.

Następnie tworzymy wystąpienie QApplication, które nazwiemy app. Przekazujemy tutaj argc oraz argv do konstruktora, pozwalając Qt przetworzyć i użyć argumentów, które mają wpływ na Qt.

Ustawiamy także kilka metadanych związanych z aplikacją. Zalicza się do tego organizacja, która stworzyła aplikację, strona sieciowa organizacji oraz nazwa aplikacji. Ustawiamy te właściwości w QCoreApplication, obiekcie, który zapewnia pętlę wydarzeń dla aplikacji, niezależnie od tego, czy mają interfejs graficzny, czy nie, więc gdybyśmy uruchomili ten program bez niego, to te metadane także zostałyby ustawione.

QQmlApplicationEngine umożliwia nam wczytanie aplikacji z pliku QML, co robimy w następnym wierszu. W engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); wczytujemy nasz QML z adresu URL w naszym pliku resources.qrc.

Następnie, sprawdzamy, czy nasz silnik poprawnie wczytał plik QML, sprawdzając czy lista silnika rootObjects nie jest pusta. Następnie możemy uruchomić naszą aplikację poprzez app.exec().