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[])
{
    QCoreApplication::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 de 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.

We then create a QApplication instance which we call app. We then pass argc and argv to the constructor, letting Qt parse and use arguments.

We also set some metadata relating to the application. These include the organisation that created the application, the organisation's website, and the name of the application. We set these properties by calling QApplication , instantiating an object that comes from QCoreApplication and provides the event loop for applications regardless of whether they have a GUI or not (so if we ran our program without the GUI, this metadata would still be set).

The QQmlApplicationEngine lets us load an application from a QML file, which we do in the next line. In engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); we load our QML from a URL in our Qt Resource File (resources.qrc).

Next, we check if our engine correctly loaded the QML file by checking that the engine's rootObjects() list is not empty. We can then run our application with app.exec() .