Autor des Abschnitts: jryannel
Bemerkung
Der Quellcode für dieses Kapitel befindet sich im assets Verzeichnis.
Dieses Buch soll dich auf einen Tour mitnehmen, die durch die verschiedenen Aspekte der Anwendungs-/Appentwicklung mit Hilfe von Qt version 5.x führt. Es stell die neue Qt Quick Technologie in den Mittelpunkt aber bietet auch die notwendigen Information zum Schreiben von C++-Backends und Erweiterungen für Qt Quick.
Das Kapitel stellt einen Highlevel Überblick über Qt 5 dar. Es zeigt die verschiedenen Anwendungsmodelle für Entwickler und eine Qt 5 Showcase Anwendung um eine Sneak Preview von den kommenden Dingen zu bekommen. Zusätzlich zielen die Kapitel auf einen breiten Überblick über den Qt 5 Inhalt und wie man mit den Machern von Qt 5 in Kontakt kommt.
Historisches
Qt 4 hat sich weiterentwickelt seit 2005 und stellt ein solide Basis für tausende von Anwendungen oder sogar ganze PC-Oberflächen (Desktops) und mobilen Systemen bereit. Die Muster mit denen Computer verwendet werden, habe sich in letzten Jahren geändert. Von stationären PCs hin zu portablen Laptops und mobilen Computern. Die klassischen Desktops sind mehr und mehr von mobilen Touch-basierten, immer verbundenen mobilen Bildschirmen verdrängt worden. Dadurch hat sich auch das UX (User experience, Nutzererlebnis) Paradigma verändert. Wo in der Vergangenheit ein Fenster-basiertes Userinterface dominierte, verwenden wir heutzutage viel mehr Zeit an anderen Bildschirmen mit einer anderen Userinterface Sprache.
Qt 4 wurde entwickelt, die Desktop-Welt zu bedienen und eine einheitliche Menge an Userinterface Elementen (Widgets) auf allen wichtigen Plattformen zu bieten. Die Herausforderung für Qt Entwickler hat sich geändert und liegt heute eher darin, ein touch-basiertes Userinterface für einen Benutzerabhängiges Verhalten zu bieten und diese modernen Userinterface auf allen wichtigen mobilen und Desktopsystemen zu erlauben. Qt 4.7 hat mit der Einführung von Qt Quick Technologie damit beonnen und erlaubt Entwicklern aus einfache Elementen ein komplettes neues Userinterface zu erschaffen, welches sich am Bedarf der Endnutzer orientiert.
Qt 5 ist eine komplette Überarbeitung der schon sehr erfolgreichen Qt 4 Veröffentlichung. Mit Qt 4.8, das Qt 4 Release ist fast 7 Jahre alt. Zeit um die beeindruckende Werkzeugsammlung noch beeindruckender zu machen. Qt 5 fokussiert sich auf folgendes:
Herausragende Grafik: Qt Quick 2 basiert auf OpenGL (ES) und nutzt eine scene graph Implementierung. Der Grafikstack erlaubt ein neues Level an Grafikeffekten, die zusammen mit der einfachen Nutzung bisland unerreicht sind.
Developer Productivity: QML und JavaScript werden als die Hauptwerkzeuge für die UI Erstellung gesehen. Das Backend wird in C++ realisiert. Die Trennung zwischen JavaScript und C++ erlaubt schnellere Zyklen sowohl Fronend-Entwickler, die sich auf hübsche Userinterfaces, als auch für Backend-Entwickler, die sich auf Stabilität, Performanz und das Laufzeitverhalten konzentrieren.
Cross-Plattform Portabilität: Über die konsolidiert Qt Plattform Abstraktion ist es jetzt möglich, Qt auf eine größere Anzahl an Plattformen zu portieren. Qt 5 ist um das Konzept von Qt Essentials und Qt Add-ons strukturiert, welches Betriebssystementwicklern erlaubt sich auf die notwendigen Module zu konzentrieren, was dann zu einer schnelleren Laufzeit führt.
Open Development: Qt ist jetzt ein wirklich open-governance Projekt, das unter qt.io gehostet wird. Die Entwicklung steht offen und wird von einer Community vorangebracht.
Qt Quick ist der Überbegriff für die Benutzerschnittstellentechnologie (oft Userinterface oder kurz UI genannt) in Qt 5. Qt Quick selbst ist eine Sammlung mehrerer Technologien:
QML - Die Auszeichnungssprache für die Userinterfaces
JavaScript - Die dynamische Skriptsprache
Qt C++ - eine hoch portable erweiterte C++ Bibliothek
Genau wie HTML ist QML eine Auszeichnungssprache. Sie besteht aus “Tags”, die in Qt Quick “Elemente” in genannt werden und deren Eigenschaften durch geschweifte Klammern umschlossen werden Item { }
. Es wurde von Grund auf für die Erstellung von Userinterfaces, Geschwindigkeit und einfacher Lesbarkeit für die Entwickler konzipiert. Das Userinterface kann dann durch JavaScript Code verbessert werden. Qt Quick ist zudem durch Qt C++ einfach mit nativer, eigener Funktionalität erweiterbar. Kurzum, das beschreibende UI wird das Frontend genannt und die nativen Teile werden Backend genannt. Das erlaubt es, rechenintensive und systemspezifische Operationen deiner Anwendung von der Benutzerschnittstellt zu trennen.
In einem typischen Projekt wird das Frontend mit QML/JavaSCript entwickelt und der Backend Code, welcher mit dem System interoperiert und die rechenintensiven Dinge macht wird mit Qt C++ entwickelt. Das erlaubt es eine natürliche Trennung zwischen den eher Design-orientierten Entwicklern und den funktionalen Entwicklern zu machen. Typischerweise wird das Backend mit Qt-eigenen Testframeworks getestet und dann für die Frontend-Entwickler zur Verfügung gestellt.
Erstellen wir ein einfaches Userinterface mit Qt Quick, welches ein paar Eigenschaften der QML Sprache präsentieren soll. Am Ende haben wir eine Papierwindmühle mit sich drehenden Rotorblättern.
Wir starten mit einem leeren Dokument, das wir main.qml
nennen. Alle QML-Dateien bekommen die Endung .qml
. Als Auszeichnungssprache (ebenso wie HTML) braucht ein QML-Dokument genau ein Wurzelelement, welches in unserem Beispiel das Image
-Element mit einer Breite und einer Höhe sein wird, die auf der Geometrie des als Hintergrund verwendeten Bildes basiert:
import QtQuick 2.5
Image {
id: root
source: "images/background.png"
}
Weil QML keine Einschränkungen macht, welches Element die Wurzel darstellt, verwenden wir das Image
-Element als Wurzel, für das wir die source
-Eigenschaft auf das Hintergrundbild setzen.
Bemerkung
Jedes Element hat Eigenschaften, wie z.B. ein Bild eine Höhe und Breite, aber eben auch andere Eigenschaften wie die source
-Eigenschaft. Die Größe des Image
-Elements wird automatisch aus der Bildgröße abgeleitet. Andernfalls müssten wir die Breite und Höhe auf sinnvolle Pixelanzahlen setzen.
Die meisten Standardelemente finden sich im QtQuick
Modul welches wir in der ersten Zeile einbinden.
Die id
-Eigenschaft ist eine spezielle, optionale Eigenschaft die einen eindeutigen Schlüssel (Identität, ID) enthält, mit dem man auf dieses Element an anderer Stelle im Dokument verweisen kann. Wichtig: Eine id
-Eigenschaft kann nicht mehr geändert werden, sobald sie gesetzt wurde und kann nicht während der Laufzeit gesetzt werden. Den Wert root
für die ID des Wurzelelements zu verwenden mache ich üblicherweise so, damit das Wurzelelement in großen Dokumenten vorhersagbar verwendet werden können.
Die Elemente Stab und Windrad im Vordergrund unseres Userintefaces werde als eigene Bilder platziert.
Der Stab muss horizontal mittig unten platziert werden und das Windrad kann in der Bildmitte des Hintergrunds erscheinen.
Normalerweise besteht dein Userinterface aus vielen verschiedenen Elementtypen und nicht nur aus image
-Elementen wie in diesem Beispiel.
Image {
id: root
...
Image {
id: pole
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
source: "images/pole.png"
}
Image {
id: wheel
anchors.centerIn: parent
source: "images/pinwheel.png"
}
...
}
Um das Windrad mittig zu plazieren verwenden wir eine komplexe Eigenschaft mit dem Namen anchor
(“Anker”). Das Verankern erlaubt dir eine geometrische Beziehung zwischen Eltern- und Geschwisterobjekten festzulegen. Beispielsweise bedeutet anchors.centerIn: parent
“plaziere mich im Zentrum des Elternelements. Es gibt die Beziehungen “left”, “right”, “top”, “bottom”, “centerIn”, “fill”, “verticalCenter” und “horizontalCenter” auf beiden Seiten. Natürlich müssen diese zusammenpassen. Es ergibt keinen Sinn meine linke Seite an der Oberseite eines anderen Elements zu verankern.
So setzen wir das Windrad mittig auf den Hintergrund des Elternelements.
Bemerkung
Manchmal will man kleine Anpassungen zur exakten Zentrierung machen. Dies wäre dann mit der Eigenschaft anchors.horizontalCenterOffset
oder mit anchors.verticalCenterOffset
möglich. Ähnliche Eigenschaften zur Anpassung gibt es ebenso für alle anderen Anker. Bitte schau in der Dokumentation für eine vollständige Liste nach.
Bemerkung
Ein Bild als Kindelement des Wurzelelements (auch ein Image
Element) festzulegen zeigt ein wichtiges Konzept dieser Beschreibungssprache. Man beschreibt das Userinterface über Ebenen und Gruppierungen, bei der die oberste Ebene (unser Rechteck) zuerst gezeichnet wird und dann alle Kindebenen darüber gezeichnet werden im lokalen Koordinatensystem des oberen Elements.
Um dieses Beispielprojekt ein bisschen interessanter zu gestalten, wollen wir die Szene interaktiv machen. Die Idee ist, dass das Rad sich dreht, wenn der Benutzer mit der Maus irgendwo in der Szene klickt.
Wir verwenden das MouseArea
Element und machen es so groß wie unser Wurzelelement.
Image {
id: root
...
MouseArea {
anchors.fill: parent
onClicked: wheel.rotation += 90
}
...
}
Die Mausfläche sendet ein Signal sobald der Benutzer innerhalb der bedeckten Fläche klickt. Man kann sich in dieses Signal einklinken, indem man die onClicked
Funktion überschreibt. In diesem Fall binden daran das Bild des Rades und ändern dessen Drehung um +90 Grad.
Bemerkung
Das funktioniert für jedes Signal, die Namensgebung ist immer on
+ SignalName
in Großschreibung. Ebenso senden alle Eigenschaften Signale wenn deren Wert sich ändern, die Namensgebung ist hier:
on
+EigenschaftsName
+Changed
Wenn sich eine width
-Eigenschaft ändert, kann man das über die Funktion onWidthChanged: print(width)
beispielsweise beobachten.
Jetzt wird sich das Rad drehen, aber das funktioniert noch nicht flüssig. Die Drehung ändert sich sofort. Wir hätten aber lieber, dass sich die Eigenschaft mit der Zeit um 90 Grad ändert. Hier kommen Animationen ins Spiel. Eine Animation definiert wie sich eine Eigenschaft ändert über eine gewisse Zeitspanne. Dafür verwenden wir einen Animationstyp mit dem Namen Behaviour`. Dieses Verhalten einer Eigenschaft gibt genau an, wie die zugehörige Eigenschaft animiert werden soll, wenn eine Änderung für diese Eigenschaft ansteht. Kurz gesagt, sobald sich die Eigenschaft ändert, läuft die Animation los. Das ist nur eine von mehreren Möglichkeiten, eine Animation in QML zu definieren.
Image {
id: root
Image {
id: wheel
Behavior on rotation {
NumberAnimation {
duration: 250
}
}
}
}
Immer wenn sich die Drehungseigenschaft des Rades ändert, wird dies über NumberAnimation
animiert mit einer Dauer von 250ms, also wird jede 90 Grad-Drehung 250ms dauern.
Bemerkung
Man sieht nicht wirklich ein verschwommenes Rad, das soll nur die Animation verdeutlichen. Aber ein verschwommenes Rad ist auch im Unterverzeichnis “assets”. Vielleicht willst du das mal ausprobieren.
Jetzt sieht das Rad viel besser aus. Ich hoffe, dieses Beispiel hat dir ein bisschen geholfen, die Programmierung mit Qt Quick zu verstehen.
Qt 5 besteht aus einer großen Anzahl von Modulen. Ein Modul ist eine Bibliothek für die Entwickler. Manche Module sind für eine für Qt spezifizierte Plattform verpflichtend. Diese Menge an Modulen heißt Qt Essentials
Module. Viele Module sind aber optional und bilden die Menge Qt Add-On
Module. Man erwartet, dass die Mehrheit der Entwickler diese nicht braucht aber es ist gut zu wissen, dass es sie gibt, denn dort sind wertvolle Lösungen zu üblichen Problemen programmiert.
Die “Qt Essentials” Module sind notwendig für eine auf Qt basierende Plattform. Sie bieten die Grundlage um eine moderne Qt 5 Anwendung mit Hilfe von Qt Quick 2 zu entwickeln.
Die “Core-Essential” Module
Eine minimale Sammlung von Qt 5 Modulen um mit QML zu programmieren.
Modul |
Beschreibung |
---|---|
Qt Core | Zentrale nicht-graphische Klassen, die von anderen Modulen verwendet werden. |
Qt GUI | Basisklassen für die graphischen Userinterface (GUI) Komponenten. Inklusive der Verwendung von OpenGL. |
Qt Multimedia | Dies sind Klassen für Audio, Video, Radio und Kamera Funktionen. |
Qt Network | Diese Klassen machen die Netzwerkprogrammierung einfacher und portabler. |
Qt QML | Dies sind Klassen für die Sprachen QML und JavaScript. |
Qt Quick | Das beschreibende Framework um extrem dynamische Anwendungen mit eigenen Userinterfaces zu bauen. |
Qt SQL | Klassen für die Intergration von SQL-Datenbanken. |
Qt Test | Klassen für die Unit-Tests für Qt Anwendungen und Bibliotheken. |
Qt WebKit | lassen für eine WebKit2 basierte Umsetzung und eine neue QML API. Siehe auch die Qt WebKit Widgets in den Addon Modulen. |
Qt WebKit Widgets | WebKit1 und QWidget-basierte Klassen aus Qt 4. |
Qt Widgets | Klassen um die Qt GUI mit C++ Widgets zu erweitern. |
Qt Addon Module
Neben den wichtigen Modulen bietet Qt zusätzliche Module für Softwareentwickler, die nicht Teil der Veröffentlichung sind. Hier ist eine kurze Liste von verfügbaren Addon Modulen.
Qt 3D - Eine Menge von APIs um graphische 3D Programmierung einfach und beschreibend zu machen.
Qt Bluetooth - C++ und QML APIs für Plattformen, die Bluetooth Technologie verwenden.
Qt Contacts - C++ und QML APIs um Adressbücher und Kontaktdatenbanken anzusprechen.
Qt Location - Erlaubt die Posititionierung, Kartierung, Navigation und Ortssuche über QML und eine C++ Schnittstelle. Es wird ein NMEA backend für die Positionierung verwendet.
Qt Organizer - C++ und QML APIs um auf eine persönliche Informationsverwaltung (Organizer, Todos, Veranstaltungen, etc.) zuzugreifen.
Qt Sensors - Zugriff auf Sensoren über ein QML und C++ Interface.
Qt Service Framework - Anwendungen sollen Zugriff auf Änderungsnachrichten lesbar, navigierbar und abonnierbar haben.
Qt System Info - Entdecke systembezogene Informationen und Fähigkeiten.
Qt Versit - Unterstützung für vCard und iCalender Formate.
Qt Wayland - Nur unter Linux. Enthält eine Qt Compositor API (server) und Wayland Plattform Plugins (clients).
Qt Feedback - Fühlbare und Audio-Rückkopplung auf Benutzeraktionen.
Qt JSON DB - Ein no-SQL Objektspeicher für Qt.
Bemerkung
Weil diese Module nicht Teil der Veröffentlichung sind, unterscheidet sich der Zustand der Module, abhängig davon wie viele Beitragende sich beteiligen und wie gut das Modul getestet wird.
Qt unterstützt eine Reihe von Plattformen. Alle größeren Desktops und eingebettete Systeme werde unterstützt. Über die Abstraktion einer Qt Anwendung ist es heutzutage einfacher wenn nötig eine Qt auf deine eigene Plattform zu portieren.
Das Testen von Qt 5 auf einer Plattform ist zeitraubend. Eine Untermenge wurde vom Qt Projekt ausgesucht und bildet die Menge an Referenzplattformen. Diese Referenzplattformen wurden ausgiebig getestet um beste Qualität zu garantieren. Aber Vorsicht: kein Code ist fehlerfrei.
Ein Auszug aus dem Qt Project wiki:
(Übersetzung) “Das Qt Projekt ist eine meritokratische auf Übereinstimmung basierendehe Gemeinschaft die sich an Qt interessiert. Jeder der dieses Interesse teilt kann der Gemeinschaft beitreten, an deren Entscheidungsprozesse teilnemen und zur Entwicklung von Qt beitragen.”
Das Qt Projekt ist eine Organisation die den Open-Source Teil von Qt weiterentwickelt. Es bildet die Basis für andere Benutzer, die beitragen wollen. Der größte Beitrag kommt von DIGIA, die auch die kommerziellen Rechte zu Qt hält.
Qt hat einen Open-Source Aspekt und einen kommerziellen Aspekt. Der kommerzielle Aspekt existiert für Firmen, die die Open-Source Lizenzen nicht einhalten können oder einhalten werden. Ohne diesen kommerziellen Askpekt wäre es für Firmen nicht möglich Qt zu verwenden und auch nicht DIGIA erlauben, so viel Quellcode dem Qt Projekt beizusteuern.
Viele Firmen weltweit die von Beratung oder Produktentwicklung leben verwenden Qt auf mehreren Plattformen. Es gibt viele Open-Source Projekte und Open-Source Entwickler, die sich auf Qt als deren hauptsächlicher Bibliothek zur Entwicklung verlassen. Es fühlt sich gut an, Teil dieser lebhaften Gemeinschaft zu sein und mit diesen fantastischen Werkzeugen und Bibliotheken zu arbeiten. Macht es dich zu einem besseren Menschen? Vielleicht :)
Trage hier bei: http://wiki.qt.io/