Flexibler durch Modularisierung
In der Vergangenheit trat das Qt-Framework als monolithischer Block in Erscheinung. Zur Verkleinerung der Binärdatei gab es zwar einzelne Module, beim Portieren galt es aber als Sache des guten Tons, immer das gesamte Framework zu bearbeiten. Vatras Arbeiten an Necessitas zeigten, dass diese Vorgehensweise nicht optimal ist. In Qt 5 unterteilt Digia sein Produkt deshalb in drei Kategorien namens Essentials, Add-Ons und Tools.
Als Qt Essentials bezeichnet das Qt-Team jene Module, die auf allen unterstützten Plattformen verfügbar sind und während der gesamten Lebenszeit von Qt 5 quell- und binärkompatibel gehalten werden. Spezifisch handelt es sich dabei um elf Module, die die folgende Tabelle zusammenfasst.
| Modulname | Kurzbeschreibung |
| Core | Basisklassen für den Rest des Frameworks |
| GUI | OpenGL und Basisklassen für grafische Darstellung |
| Multimedia | Kamera, Audio, Video |
| Netzwerk | Diverse Klassen zum Erstellen portabler Netzwerkanwendungen |
| QML | Logik von QML |
| Quick | Grafische Repräsentation für QML |
| SQL | Datenbankintegration |
| Test | Unit-Testing |
| WebKit | HTML-Renderer |
| WebKit Widgets | HTML-Renderer von Qt 4 |
| Widgets | Grafische Elemente von Qt 4 |
Die Add-Ons sind zusätzliche Module, die weitere Funktionen zum Framework hinzufügen. Viele von ihnen sind auf allen unterstützten Plattformen verfügbar. Der Unterschied zu den Essentials besteht darin, dass jedes Add-On-Modul seine eigenen Bedingungen zur Plattformunterstützung und Kompatibilität festlegen darf. Zu guter Letzt gibt es die Gruppe der Tools. Dabei handelt es sich um Werkzeuge für Entwickler, die auf allen Entwicklungsplattformen verfügbar sind.
JSON und Co.
Vermutlich am interessantesten unter den Neuerungen von Qt 5 ist – neben der weiter unten besprochenen Verbesserung im Signal-Slot-System – die Integration eines Parsers für das im JavaScript-Bereich verbreitete JSON-Format. Die im Core-Modul angesiedelte QJsonDocument-Klasse erlaubt das Einlesen von Arrays oder "Objekten" (besser: assoziative Arrays) aus JSON-Dateien. Die aufwendige Konversion in native Arrays oder QVariantMap-Instanzen erfolgt durch das Framework.
Die Klasse QStandardPaths liefert auf Anfrage eine Liste relevanter Pfade zurück. So ist es in Qt 5 möglich, den Pfad des Font-Ordners der Host-Maschine ohne nativen Code zu ermitteln – die StandardLocation-Enumeration listet alle abfragbaren Verzeichnisse auf.
Wer häufig reguläre Ausdrücke parst, profitiert von der neuen QRegularExpressions-Klasse. Sie implementiert die aus Perl bekannte PCRE-Syntax (Perl Compatible Regular Expressions), was das Verwenden der diversen RegEx-Bibliotheken unnötig macht.
Die Änderungen im Netzwerk-Stack fallen gravierend aus. Erstens sind die QFtp- und QHttp-Klassen nun nur mehr als optionale Add-ons erhältlich; stattdessen sollen die Entwickler auf den schon mit Qt 4 eingeführten QNetworkAccessManager umsteigen.
Als "Ersatz" für die aufgrund der Entfernung des Qt3Support-Moduls nicht mehr verfügbare Q3Dns-API gibt es die neue Klasse QDnsLookup. Sie handhabt das Absetzen von DNS-Anfragen, das Hantieren mit Sockets entfällt an der Stelle komplett.
Zu guter Letzt verbessert Qt 5 die Interaktion mit per IPv6 ansprechbaren Endpunkten. Die Socket-Klassen verbinden sich ab sofort, sofern nicht explizit zum Verwenden eines bestimmten Protokolls angewiesen, sowohl per IPv4 als auch per IPv6 mit den als Ziel übergebenen Gegenstellen.
Ein Qt Multimedia genanntes Modul vereinigt die bekannte QtMultimedia-Bibliothek und das nur auf Mobilplattformen verbreitete Qt MultimediaKit. Es ist eine transparente Abstraktionsschicht zwischen Anwendung und Betriebssystem, die keine eigenen Codecs mitbringt. Daraus folgt, dass die Anzahl der unterstützten Medienformate nach wie vor von Plattform zu Plattform verschieden ist – eine Falle für Entwickler, die damit nicht rechnen.
Signal-Slot-Prüfung bei der Kompilierung
Das Signal-Slot-System sticht unter den Neuerungen heraus. Es erlaubt das Entkoppeln der einzelnen Klassen eines Systems. Statt die Objekte direkt miteinander zu verbinden, erfolgt die Kommunikation über ein vom Framework bereitgestelltes Event-System. Zum Aufbau von Verbindungen kommt eine connect() genannte Methode zum Einsatz. Diese arbeitet in Qt 4 mit Strings – als Beispiel dafür ein connect()-Aufruf aus einem kommerziellen Produkt des Autors:
QObject::connect(buttonBox, SIGNAL(accepted()), HighscoreForm,
SLOT(accept()));
Die Makros SIGNAL und SLOT wandeln die an sie übergebenen Signaturen während des Durchlaufs des Präprozessors in Strings um. Der Compiler sieht also einen Methodenaufruf nach folgendem Schema:
QObject::connect(Objektpointer, String, Objektpointer, String);
Daraus folgt, dass es nicht möglich ist, die Gültigkeit der Verbindung zwischen Signal und Slot während der Kompilierung zu überprüfen. Stattdessen findet der Check erst zur Laufzeit (also beim Aufruf von connect()) statt. Wenn der Aufruf erst am Computer des Endanwenders auftritt, hat das Programm einen Fehler.
Qt 5 bringt neue Overloads der Methode connect() mit. Sie akzeptieren statt der Strings Funktions-Pointer und ermöglichen so das Überprüfen der Korrektheit der Verbindung schon während der Kompilierung des Programms:
QObject::connect(sender, &Sender::valueChanged, receiver,
&Receiver::updateValue);
Zu guter Letzt können C++11-fähige Compiler Signale mit Lambda-Funktionen verdrahten. Das ermöglicht die von HTML bekannten "Inline Functions". Ob das auf die Übersichtlichkeit des Codes positiv wirkt, muss jeder Entwickler für sich entscheiden.
Ab sofort kann man sich mit Vorträgen für die neue Konferenz zu Agile ALM, Continuous Delivery und DevOps bewerben.





Am 5. und 6. Juni trifft sich in Toulouse die Eclipse-Community zur Erstauflage der EclipseCon France. Bis 26. Mai kann man sich noch zum Frühbucherpreis registrieren.