Descobrir el main.cpp

Comprenent el fitxer central del nostre codi de dorsal

El paper de main.cpp

Si bé el QML s'utilitza per al frontal de les aplicacions escrites amb el Kirigami, el dorsal generalment s'escriu en C++ gràcies a la velocitat i flexibilitat d'aquest llenguatge. Si bé en les pàgines anteriors hem cobert el QML amb molta profunditat, necessitarem comprendre el nostre codi en C++ del dorsal per a crear aplicacions que siguin més útils del que podem aconseguir amb un QML pur.

Aquí, repassarem el fitxer main.cpp que hem creat a la pàgina Com començar perquè puguem comprendre millor el que està succeint en el fitxer central de C++ de la nostra aplicació. Si bé aquest és un main.cpp bàsic, les característiques que repassarem seguiran sent essencials, sense importar la classe d'aplicació que decidiu crear.

Què és el que fa

 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();
}

Primer hem d'incloure una sèrie de fitxers de capçalera de les Qt, i això ens permetrà utilitzar les seves funcions. En aquest cas, incloem una sèrie de capçaleres de les Qt que manegen la lògica de l'aplicació i ens permet accedir a fitxers QML.

Després creem una instància QApplication a la que anomenarem app. La crida requereix passar argc i argv al constructor.

També establim algunes metadades relacionades amb l'aplicació. Aquestes inclouen l'organització que va crear l'aplicació, el lloc web de l'organització i el nom de l'aplicació. Configurem aquestes propietats en el QApplication, un objecte que ve de QCoreApplication i proporciona el bucle d'esdeveniments per a les aplicacions, independentment de si tenen una IGU o no (pel que si executem el nostre programa sense la IGU, aquestes metadades encara s'establiran).

Per a fer que la nostra aplicació es vegi bé amb les icones Brisa i l'estil Brisa de KDE en entorns no Plasma com el Windows o el GNOME, hem de fer tres coses:

  • inicialitzar les funcions de tematització dels KIconThemes a les plataformes on els temes d'icones no formen part del sistema (com el Windows o el MacOS) amb withKIconTheme::initTheme()
  • definir el QStyle amb QApplication::setStyle() per a forçar el Brisa en lloc de l'estil natiu de la plataforma
  • definir l'estil del QtQuick Controls amb QQuickStyle::setStyle() per a forçar el Brisa amb el qqc2-desktop-style de KDE

La crida a KIconTheme::initTheme() cal fer-la abans de crear la QApplication i permetre que l'aplicació trobi les icones Brisa a usar. Cal establir el QStyle a Brisa perquè usem QApplication per a la nostra aplicació en lloc de QGuiApplication. Els controls reals de la interfície de la finestra com botons i caselles de selecció seguiran el Brisa utilitzant qqc2-desktop-style.

El QQmlApplicationEngine permet carregar una aplicació des d'un fitxer QML, el qual fem en la línia següent. A engine.loadFromModule("org.kde.tutorial", "Main"); carreguem el nostre QML des de l'URI d'importació definit al CMake.

A continuació, comprovem si el nostre motor ha carregat correctament el fitxer QML comprovant que la llista rootObjects() del motor no està buida. Després podem executar la nostra aplicació amb app.exec().