Qt5 stellt sich vor

Autor des Abschnitts: jryannel

Issues: Create | View

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.

Vorwort

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.

Worauf sich Qt 5 fokussiert

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.

Eine Einführung in Qt 5

Qt Quick

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

../_images/qt5_overview.png

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.

Wir wagen uns an ein Userinterface

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.

../_images/scene.png

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.

../_images/background.png

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.

../_images/pole.png
../_images/pinwheel.png

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.

../_images/scene2.png

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.

Qts Legosteine

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.

Qt Module

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.

digraph essentials {
QtGui -> QtCore
QtNetwork ->QtCore
QtMultimedia ->QtGui
QtQml -> QtCore
QtQuick -> QtQml
QtSql -> QtCore
}

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 Publish and Subscribe
  • 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.

Unterstützte Plattformen

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.

Qt Projekt

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/