Descubriendo main.cpp

Entendiendo el archivo central de nuestro código de motor

El papel de main.cpp

Mientras que QML se usa para la interfaz de las aplicaciones de Kirigami, el motor se suele escribir en C++ gracias a la velocidad y flexibilidad de este lenguaje. Si bien en las páginas anteriores hemos cubierto QML con mucha profundidad, necesitaremos comprender nuestro código C++ del motor para crear aplicaciones que sean más útiles de lo que podemos lograr con QML puro.

Aquí repasaremos el archivo main.cpp que creamos en la página 'Primeros pasos' para que podamos entender mejor lo que está sucediendo en el archivo central de C++ de nuestra aplicación. Aunque este es un main.cpp básico, las características que vamos a repasar seguirán siendo esenciales independientemente del tipo de aplicación que decida crear.

Lo que hace

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

Primero debemos incluir una serie de archivos de cabecera Qt, lo que nos permite usar sus funciones. En este caso, incluimos una serie de cabeceras Qt que manejan la lógica de la aplicación, leen archivos QML y acceden a los archivos definidos en resources.qrc.

Entramos a nuestra función principal. Su primera línea QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); habilita el escalado para pantallas de alta densidad. Esto permite que nuestra aplicación se pueda escalar correctamente en dispositivos con pantallas de diferentes densidades de píxeles.

A continuación creamos una instancia de QApplication que llamaremos app. Aquí pasamos argc y argv al constructor, dejando que Qt analice y use los argumentos que pueden afectar a Qt.

También definimos varios metadatos relacionados con la aplicación. Entre ellos, la organización que ha creado la aplicación, la página web de esta organización y el nombre de la aplicación. Definimos estas propiedades en QCoreApplication, un objeto que proporciona el bucle de eventos de las aplicaciones sin importar si disponen de una interfaz gráfica de usuario o no (de modo que si ejecutamos nuestro programa sin interfaz de usuario, estos metadatos también se definirían).

El QQmlApplicationEngine nos permite cargar una aplicación de un archivo QML, que es lo que haremos en la siguiente línea. En engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); cargamos nuestro QML de una URL de nuestro archivo resources.qrc.

Seguidamente, nos aseguramos de que nuestro motor ha cargado correctamente el archivo QML comprobando que la lista rootObjects del motor no está vacía. En tal caso podemos ejecutar nuestra aplicación con app.exec().