© StonePictures/Shutterstock.com
Teil 3: GUI mit Qt

Lob der Freiheit


Als die Qt Company – damals noch unter Nokias Führung – QML einführte, fragte sich mehr als ein Augure, ob die Finnen nun komplett wahnsinnig sind. Die Vor- und Nachteile dieses neuartigen GUI-Stacks wollen wir uns in diesem Artikel zu Gemüte führen.

Auch hier gilt, dass der beste Weg zum Verständnis der Zukunft der Blick in die Vergangenheit ist. Stellen wir uns die Situation im Hause Nokia vor: Neben dem im Massenmarkt nur wenig relevanten Maemo-Betriebssystem verkauften die Finnen damals vor allem jede Menge Smartphones auf Basis des Klassikers Symbian.

Symbian mag ein aus technischer Sicht sehr stabiles Betriebssystem gewesen sein, es ist aus Sicht eines GUI-Entwicklers allerdings der absolute Albtraum. Der GUI-Stack ist auf einige im Großen und Ganzen listenartige Steuerelemente beschränkt. Für den Widgets-GUI-Stack war dies eine Katastrophe, als das normalerweise praktizierte native Realisieren von Steuerelementen unmöglich war. Die Entwickler begannen damit, für fehlende Steuerelemente virtuelle Versionen nachzurüsten. Im Laufe der Zeit kamen Benutzer dann auf den Gedanken, dass man doch eigentlich auch einen kompletten GUI-Renderer in Qt integrieren könnte (Abb. 1).

hanna_qt_teil3_1.tif_fmt1.jpgAbb. 1: LightHouse steht zwischen Qt-Applikation und Betriebssystem

Statt dem Entwickler fertige Steuerelemente anzubieten, offeriert QML von Haus aus per GL beschleunigte grafische Primitiva. Das eigentliche Zusammenstellen der Benutzerschnittstelle war anfangs alleinige Verantwortung des Entwicklers, der aus Rechteck, Textlabel und Abrundungselement mehr oder weniger komplizierte Widgets zusammenpappte.

Qt mit Visual Studio 2019

Während des Verfassens dieses Teils der Artikelserie lieferte Microsoft eine Preview von Visual Studio 2019 aus. Wer Qt mit ihr verwenden möchte, braucht im ersten Schritt eine für Windows vorgesehene Payload wie Desktopentwicklung mit C++.

Qt Creator muss unbedingt in einer Version größer 4.9.0 vorliegen, für die Desktop-Payload benötigen wir MSVC 2017 in der 32- und der 64-bit-Version. Prüfen Sie im nächsten Schritt in den Einstellungen, ob Qt Creator ein neues Kit erfasst hat – das Aufscheinen eines Rufzeichens vor dem Namen zeigt, dass Konfigurationen fehlen. In der Praxis fehlen vor allem Compiler, die sich wie in Abbildung 2 gezeigt einrichten lassen.

hanna_qt_teil3_2.tif_fmt1.jpgAbb. 2: Mit dieser Konfiguration lassen sich unsere Programme mit VS 2019 kompilieren

In Tests des Autors erwies sich die Entwicklung von Applikationen für die UWP als noch nicht möglich – bleiben Sie in diesem Fall einfach bei VS 2017. Das gilt derzeit auch für den Debugger – ein Thema, das uns hier aber nicht aufhalten soll.

QML, modern

Die meisten Lehrbuchautoren beginnen an dieser Stelle mit der Realisierung von mehr oder weniger lustigen grafischen Demobeispielen. Die direkte Interaktion mit QML-Markup mag in der Anfangszeit eine wichtige Rolle gespielt haben, wird heute aber immer weniger wichtig. Die Ursache dafür ist, dass Digia seit längerer Zeit mit Qt Quick Controls einen weiteren GUI-Stack anbietet, der eine Gruppe schlüsselfertiger Steuerelemente für QML-Applikationen bereitstellt.

Zur Demonstration seiner Möglichkeiten kehren wir zu Qt Creator zurück und öffnen abermals den Projektassistenten. Entscheiden Sie sich im nächsten Schritt für die Vorlage für Qt Quick-Anwendung – leer und bestätigen Sie diese durch Auswählen. Die anderen vom Projektgenerator angebotenen Vorlagen würden komplexere Skelette erzeugen, die wir momentan nicht benötigen.

Die sonstigen Einstellungen verhalten sich im Großen und Ganzen so, wie Sie es schon kennen. Wichtig ist nur, dass Sie im Bereich der mindestens benötigten Qt-Version die Version 5.9 auswählen. Nach dem Durcharbeiten des Projektgenerators sehen Sie das in Abbildung 3 gezeigte Ergebnis.

hanna_qt_teil3_3.tif_fmt1.jpgAbb. 3: Unser kleines Beispielprojekt ist vergleichsweise primitiv

Der Lohn der Mühen ist eine primitive QML-Anwendung, die ohne QML-Stack und Co. auskommt. Der Vorteil ist, dass die Struktur des Programms klar ist – in main.cpp findet sich nun folgender Codeblock:

#include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QQmlApplicationEngine engine;

Unsere Applikation beinhaltet eine Instanz der Klasse QGuiApplication, die ihrerseits über eine QqmlApplicationEngine für die Bereitstellung des weiter oben besprochenen Renderers verantwortlich ist. Im nächsten Schritt laden wir die .QML-Datei, die die eigentlichen Informationen enthält:

 engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); }

An dieser Stelle sei angemerkt, dass das Laden von QML-Markup prinzipiell zur Laufzeit erfolgt. Das kann insbesondere in rechtlich haarigen Situationen Probleme verursachen – in der Anfangszeit des Ovi Stores von Nokia gab es beispielsweise einige Entwickler, die nachträgliches Ändern des Markups in der Applikation...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang