Cross-Plattform: Qt 6 bringt eine neue Abstraktionsschicht für 3D-Grafik mit
Das Cross-Plattform-Framework löst sich von OpenGL und vereinheitlicht die 2D/3D-Grafik. Die Änderungen der Lizenzpolitik sind indessen für manche unangenehm.
Nach einer längeren Vorbereitungsphase ist Version 6 des Qt-Frameworks planmäßig zum Jahresende erschienen. Als erstes Major-Release seit acht Jahren bringt die plattformübergreifende Library einige grundlegende Änderungen in der Architektur mit, darunter einen neuen Layer für 3D-Grafik, die Anbindung an C++17 und ein erweitertes Qt-Quick-3D-Modul.
Die grundlegenden Änderungen sind wie bei frischen Hauptversionen üblich mit Inkompatibilitäten beziehungsweise Breaking Changes verbunden. Die Qt Company hat laut eigenen Angaben jedoch versucht, die auf Entwicklerseite benötigten Codeänderungen bei der Umstellung so gering wie möglich zu halten. Nahezu alle in Qt 6 entfernten APIs sind wohl im letzten LTS-Release (Long-Term Support) Qt 5.15 als überholt (deprecated) gekennzeichnet.
Flexibel hinsichtlich der 3D-API
Eine zentrale Änderung ist bereits seit Qt 5.14 im Framework enthalten, war allerdings auch unter Qt 5.15 noch als Technical Preview gekennzeichnet, die eine explizite Aktivierung über eine Umgebungsvariable erforderte: Das Framework entfernt die feste Anbindung an OpenGL als Schnittstelle für 3D-Grafiken und bringt eine neue Schicht namens Rendering Hardware Interface (RHI) mit.
Die gesamte 3D-Grafik in Qt Quick setzt auf die Abstraktionsebene auf, und standardmäßig nutzt das Framework Direct3D unter Windows und Metal unter macOS. Daneben kann es Vulkan und nach wie vor OpenGL beziehungsweise OpenGL ES verwenden.
Qt Quick 3D und Qt 3D
Version 5.14 führte Qt Quick 3D zunächst als Technical Preview ein. Entwicklerinnen und Entwickler können über das Modul 3D-Szenen in der Skriptsprache QML definieren und so einheitlich 3D- und 2D-Darstellungen entwickeln. Unter anderem können sie Qt-Quick-Inhalte als Texturen für 3D-Objekte verwenden. Das Qt-Quick-3D-Modul bringt in Qt 6 zahlreiche Anpassungen mit, die unter anderem auf die RHI-Anbindung zielen. Darüber hinaus gibt es Erweiterungen für das Zusammenspiel von 2D- und 3D-Objekten und eine verbesserte Integration für das Rendern von gITF2-Inhalten (GL Transmission Format).
Wer nicht umstellen möchte, findet die auf OpenGL zugeschnittenen Klassen ausgelagert im QtOpenGL
-Modul. Das ebenfalls neue Modul QtShaderTools
bietet Zugang zu den unterschiedlichen Shader-Sprachen für die 3D-APIs und nutzt dafür die Zwischensprache SPIR-V (Standard Portable Intermediate Representation).
Frischer(er) C++-Standard
Bei der Anbindung an C++ setzt Qt 6 auf C++17, was zwar nicht dem aktuellsten Sprachstandard C++20 entspricht, aber Qt war seit Version 5.7 bis Version 5.15 auf dem Stand von C++11. Mit der Anbindung an C++17 ermöglicht Qt 6 unter anderem den Zugriff auf die Property Bindings in Qt aus C++ heraus.
Außerdem hat das Team die häufig kritisierte QList
-Klasse geändert, die bei der Speicherzuweisung einen Umweg geht, und neue Elemente innerhalb der Liste als void*
-Pointer speichert, die auf die tatsächlichen Elemente verweisen. Qt 6 vereinheitlicht die Umsetzung nun mit der der anderen Container-Klasse QVector
, und die Implementierung letzterer Klasse dient als gemeinsame Architektur.
Daneben hat das Qt-Team im Oktober einen Blogbeitrag veröffentlicht, nachdem es die für das Metaobjektsystem von Qt wesentlichen Klassen QMetaType
und QVariant
mit einer Anbindung an C++17 nahezu komplett neu geschrieben hat.
Plattformen und Build-System
Nennenswert ist zudem, dass Qt 6 nun plattformspezifische APIs direkt im Kern enthält. Bisher waren sie in die separaten Module QtX11Extras
, QtWinExtras
beziehungsweise QtMacExtras
ausgelagert. Mit der neuen Architektur sollen sich unter anderem die Eventverarbeitung, das Einbinden von Fenstern und Typumwandlungen besser in die Besonderheiten des Zielsystems integrieren. Außerdem löst ein Mechanismus für native Interfaces die bisherigen Platform Headers ab.
Beim Build-System setzt Qt 6 neuerdings auf CMake. Die Qt Company hat die Library damit gebaut und empfiehlt den Einsatz für Qt-Projekte. Allerdings will sie für das hauseigene qmake über den kompletten Lebenszyklus von Qt 6 weiterhin Support bieten.
Nicht vollkommen
Der Blogbeitrag zur Veröffentlichung bezeichnet Qt 6.0 als Ausgangspunkt für die nächste Qt-Generation und räumt ein, dass es noch nicht so Feature Complete sei wie Qt 5.15. Das Team will die Lücken in den kommenden Monaten füllen. Zum Abschluss des Blogbeitrags dankt das Team allen, die an der Entwicklung beteiligt waren. Tausende hätten über Bug-Reports und Feedback geholfen, und die Seite mit den Neuerungen von Qt 6 listet die Namen der 274 Personen bei, die sich an der Entwicklung aktiv beteiligt haben.
Dieses Jahr stand nicht nur das 25-jährige Jubiläum von Qt an, sondern einige Änderungen der Lizenz- und Produktpolitik haben zu Verunsicherungen geführt. Im Januar hatte die Qt Company angekündigt, LTS-Releases kommerziellen Kunden vorzubehalten. Das bedeutet konkret, dass nur sie den längeren Support des letzten 5.x-Release Qt 5.15 genießen.
Im April sorgte eine Mail aus der KDE-Community für Unruhe, laut der die Qt Company erwägt, Open-Source-Releases bis zu einem Jahr später als die kommerzielle Variante herauszugeben. Das Framework und die zugehörigen Module sind grundsätzlich unter der LGPL- beziehungsweise GPL-Lizenz verfügbar.
Auch für kommerzielle Kunden stehen mit Qt 6 potenziell unangenehme Neuerungen im Raum: Qt vertreibt das aktuelle Release ausschließlich im Abomodell, womit einige Kunden in eine Zwickmühle geraten, da das Perpetual Model entfällt, das zwar zunächst teurer ist, aber dauerhafte Zukunftssicherheit gewährt und nicht von potenziellen Preis- und Lizenzänderungen betroffen ist.
(rme)