Die Änderungen an Qt Quick
Qt 6 sind das Ergebnis des bewussten Bemühens, das Framework effizienter und benutzerfreundlicher zu gestalten.
Wir versuchen, die Binär- und Quellcodekompatibilität für alle öffentlichen APIs in jeder Version zu erhalten. Einige Änderungen waren jedoch unvermeidlich, um Qt zu einem besseren Framework zu machen.
In diesem Thema fassen wir diese Änderungen in Qt Quick zusammen und geben eine Anleitung zu deren Handhabung.
Änderungen an Qt Quick QML-Typen
Geänderter Typ von font.weight
Der Typ von font.weight
wurde in int
geändert. Die vordefinierten Gewichtsklassen existieren immer noch, aber es ist nun möglich, beliebige Ganzzahlen zu verwenden, um Schriften auszuwählen, die keiner dieser Gewichtsklassen entsprechen. Damit wird die Parität mit der C++-API sichergestellt, wo es schon immer möglich war, das Schriftgewicht als beliebige ganze Zahl auszudrücken.
Der meiste Code wird von dieser Änderung nicht betroffen sein, außer in dem Fall, in dem eine implizite Konvertierung von einem String in einen Enum-Wert verwendet wurde.
font.weight: "Bold"
Dieser Code wird nicht mehr korrekt geparst und muss durch den entsprechenden Enum-Wert ersetzt werden, wie unten gezeigt.
font.weight: Font.Bold
FontLoader.name ist jetzt eine schreibgeschützte Eigenschaft
In Qt 5 war die Eigenschaft name
von FontLoader beschreibbar und setzte die Quelleigenschaft des Elements außer Kraft, wenn sie gesetzt wurde. Dies führte zu einer gewissen Verwirrung hinsichtlich ihres Zwecks und konnte zu einem undeterministischen Verhalten führen, wenn es eine Race Condition zwischen den Settern für die widersprüchlichen Eigenschaften gab.
Dies bedeutet, dass Code wie der folgende nicht mehr funktionieren wird.
FontLoader { id: fontLoader name: "Helvetica" } Text { font.family: fontLoader.name text: "Foobar" }
Verwenden Sie stattdessen eine benutzerdefinierte Eigenschaft zum Speichern von Schriftfamiliennamen.
property string fontName: "Helvetica" Text { font.family: fontName text: "Foobar" }
Der OpenGLInfo QML-Typ wurde entfernt
In Qt 5.8 wurde OpenGLInfo veraltet und wird für Qt 6 entfernt. Bitte verwenden Sie stattdessen GraphicsInfo.
ShaderEffect unterstützt keine Inline-GLSL-Shader-Strings mehr
Genau wie bei custom materials werden die Effekte nicht mehr in Form von GLSL-Shader-Strings angegeben. Stattdessen wird erwartet, dass Shader von den Tools des Moduls Qt Shader Tools vorverarbeitet werden, wie z. B. dem Befehlszeilen-Tool qsb
, wodurch sichergestellt wird, dass die Shader-Assets unabhängig von der zur Laufzeit verwendeten Grafik-API (Vulkan, Metal, OpenGL oder Direct 3D) verwendet werden können. ShaderEffect Elemente sollen auf die resultierenden .qsb
-Dateien verweisen.
ShaderEffect-Quelleigenschaften sind jetzt URLs
Die ShaderEffect -Eigenschaften vertexShader und fragmentShader haben jetzt beide den Typ QUrl statt QByteArray. Ihr Verhalten ist daher identisch mit dem anderer ähnlicher Eigenschaften, wie Image.source. Bestehender Code, der auf Dateien über das Schema file
oder qrc
verweist, funktioniert weiterhin wie bisher. Darüber hinaus erlaubt diese Änderung, auf Dateien mit einem Pfad relativ zum Speicherort der Komponente (der .qml-Datei) zu verweisen. Die Angabe des file:
Schemas ist daher jetzt optional.
Änderungen an Qt Quick C++ APIs
Änderungen an QQuickItem
QQuickItemDie Funktion geometryChanged() von QQuickItem wurde umbenannt in geometryChange().
Änderungen an QQuickWidget
QQuickWidget ist nur funktionsfähig, wenn der Scenegraph mit OpenGL gerendert wird. Es wird nicht funktionieren, wenn eine andere Grafik-API wie Vulkan oder Metal verwendet wird. Anwendungen, die auf QQuickWidget angewiesen sind, sollten die Verwendung von OpenGL erzwingen, indem sie QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL)
in ihrer main()-Funktion aufrufen.
Änderungen an QQuick*-APIs
- Anwendungen, die ihren eigenen Satz von Vulkan-, Metal- oder Direct3D-Rendering-Befehlen integrieren möchten, sollten zusätzlich zu QQuickWindow::beforeRendering() und afterRendering() die neuen QQuickWindow Signale kennen. Das bestehende Qt 5-Muster, sich nur mit beforeRendering oder afterRendering zu verbinden, ist allein oft nicht mehr ausreichend und muss wahrscheinlich durch die Verbindung mit zusätzlichen Signalen wie beforeRenderPassRecording() oder afterRenderPassRecording() ergänzt werden.
- Anwendungen, die sich auf die Signale QQuickWindow::beforeRendering() oder afterRendering() verlassen, um ihren eigenen Satz von OpenGL-Rendering-Befehlen auszugeben, sollten QQuickWindow::beginExternalCommands() vor und QQuickWindow::endExternalCommands() nach den OpenGL-Aufrufen aufrufen. Dies stellt sicher, dass Zustandsänderungen durch den Anwendungscode nicht zu Verwirrung in Bezug auf den eigenen Cache-Zustand des Szenengraphen-Renderers führen. Beachten Sie jedoch, dass, genau wie in Qt 5, das Ändern des OpenGL 3.x oder 4.x Status, der nicht vom Qt Quick Renderer verwendet wird, immer noch zu unerwarteten Problemen führen kann, daher wird der Anwendung empfohlen, jeden solchen OpenGL Status auf den Standardwert zurückzusetzen, bevor sie von den mit diesen Signalen verbundenen Slots oder Lambdas zurückkehrt.
- Die bestehenden QQuickWindow::setRenderTarget()-Überladungen und die zugehörigen Getter werden entfernt und durch eine neue Funktion ersetzt, die eine QQuickRenderTarget annimmt. Von Anwendungen, die umgeleitetes Rendering in Kombination mit QQuickRenderControl durchführen, wird nun erwartet, dass sie diese neue Funktion verwenden, um das Rendering-Ziel auf eine Weise zu spezifizieren, die nicht an OpenGL gebunden ist.
- Die Überladung QQuickWindow::setSceneGraphBackend(), die ein QSGRendererInterface::GraphicsApi Argument annimmt, wurde in setGraphicsApi() umbenannt.
- Die QQuickWindow Funktionen setPersistentOpenGLContext und isPersistentOpenGLContext wurden umbenannt und heißen jetzt QQuickWindow::setPersistentGraphics() und QQuickWindow::isPersistentGraphics().
- setClearBeforeRendering() und clearBeforeRendering() wurden aus QQuickWindow entfernt. In Qt 6 gibt es keine Option zum Überspringen des Farbpuffer-Clearings. Der Aufruf von setClearBeforeRendering() war in Qt 5 oft in Kombination mit Underlays notwendig, um zu verhindern, dass Qt Quick den in den Farbpuffer gerenderten Inhalt löscht. In Qt 6 gibt es einen robusteren Ansatz: die Verbindung mit dem Signal
beforeRenderPassRecording()
, das nach dem Löschen, aber vor dem Rendern des Inhalts von Qt Quick ausgegeben wird. - Die Funktion QQuickWindow::openglContext() wurde entfernt. Wenn die Anwendung sichergestellt hat, dass der Szenegraph OpenGL zum Rendern verwendet, kann sie die QOpenGLContext von QSGRendererInterface::getResource() abfragen.
- Das Signal QQuickWindow::openglContextCreated() wurde entfernt.
- Die veraltete Funktion QQuickWindow::createTextureFromId() wurde entfernt. Verwenden Sie stattdessen die Funktion fromNative() von QPlatformInterface::QSGOpenGLTexture, QPlatformInterface::QSGVulkanTexture, QPlatformInterface::QSGD3D11Texture, oder QPlatformInterface::QSGMetalTexture.
- Die Klasse QQuickFramebufferObject ist mit einer unveränderten API verfügbar, funktioniert aber nur, wenn der Scenegraph mit OpenGL gerendert wird. Sie ist nicht funktionsfähig, wenn eine andere Grafik-API, wie Vulkan oder Metal, verwendet wird. Anwendungen, die sich auf QQuickFramebufferObject verlassen, sollten die Verwendung von OpenGL erzwingen, indem sie
QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL)
in ihrer main()-Funktion aufrufen. - QQuickRenderControl hat eine leicht geänderte API: grab() wurde entfernt, stattdessen wird QQuickWindow::grabWindow() verwendet, wo anwendbar. Die Funktion initialize() nimmt keine QOpenGLContext mehr an. Anwendungen müssen nun auch QQuickRenderControl::beginFrame() und QQuickRenderControl::endFrame() aufrufen, wenn dies erforderlich ist. Wenn Multisampling gewünscht ist, muss die neue Funktion QQuickRenderControl::setSamples() aufgerufen werden, um die Anzahl der Samples anzugeben.
- Anwendungen, die Qt Quick Rendering in Kombination mit einem vorhandenen nativen Grafikgerät oder Kontextobjekt durchführen möchten, müssen die neue Funktion QQuickWindow::setGraphicsDevice() verwenden, da QQuickRenderControl die Funktion
initialize(QOpenGLContext*)
nicht mehr zur Verfügung stellt. - Die Einstellung von QQuickPaintedItem und Context2D auf den Modus
Framebuffer
hat keine Auswirkungen. Es verhält sich so, als ob der Modus auf den Standard-Bildmodus eingestellt wäre. - Die Umgebungsvariable
QSG_NO_DEPTH_BUFFER
wird in Qt 6.0 noch unterstützt, aber es wird empfohlen, ihre Verwendung durch den Aufruf von setDepthBufferFor2D() auf QQuickGraphicsConfiguration zu ersetzen, das dann mit QQuickWindow verknüpft wird.
Änderungen an QSG*-APIs
- QSGMaterialShader hat eine geänderte Schnittstelle. Implementierungen sollten sich nicht mehr auf OpenGL verlassen und können nicht davon ausgehen, dass Funktionen, wie das jetzt entfernte updateState(), mit einem QOpenGLContext current aufgerufen werden. In der neuen, datenorientierten Schnittstelle wird updateState() durch updateUniformData(), updateSampledImage() und updateGraphicsPipelineState() ersetzt. Anstelle von GLSL-Shader-Code, der als Strings bereitgestellt wird, wird nun erwartet, dass Shader von den Tools des Moduls Qt Shader Tools, wie z. B. dem Befehlszeilen-Tool
qsb
, vorverarbeitet werden, wodurch sichergestellt wird, dass die Shader-Assets unabhängig davon, welche Grafik-API (Vulkan, Metal, OpenGL oder Direct 3D) zur Laufzeit verwendet wird, nutzbar sind. - QSGEngine wurde entfernt. Für den unwahrscheinlichen Fall, dass eine Anwendung diese Klasse verwendet, wird empfohlen, stattdessen auf QQuickRenderControl zu portieren.
- QSGAbstractRenderer ist nicht mehr öffentlich. Die Verwendung dieser Klasse war nur in Kombination mit QSGEngine sinnvoll, und da diese Klasse entfernt wurde, wurde QSGAbstractRenderer wieder in den privaten Bereich verschoben.
- Die Komfortklasse QSGSimpleMaterial wurde entfernt. Von Anwendungen wird erwartet, dass sie stattdessen die überarbeiteten, OpenGL-unabhängigen QSGMaterial APIs verwenden.
- Um auf das zugrundeliegende native Texturobjekt für QSGTexture zuzugreifen, ist textureId() nicht mehr verfügbar. Verwenden Sie stattdessen QSGTexture::platformInterface() mit QPlatformInterface::QSGOpenGLTexture, QPlatformInterface::QSGVulkanTexture, QPlatformInterface::QSGD3D11Texture, oder QPlatformInterface::QSGMetalTexture.
- Unterklassen von QSGImageNode müssen nun neue zusätzliche Virtuals überschreiben, wie setAnisotropyLevel() und anisotropyLevel().
- Unterklassen von QSGTexture müssen wahrscheinlich umgestaltet werden. Einige der OpenGL-spezifischen virtuellen Funktionen, wie bind() oder updateBindOptions(), sind nicht mehr vorhanden, während es neue virtuelle Funktionen gibt, die zwingend zu implementieren sind, wie comparisonKey().
Änderungen bei der Verwendung von OpenGL in Qt Quick
Obwohl es für viele Anwendungen keine Unterbrechungen geben wird, sollten sich Anwendungsentwickler darüber im Klaren sein, dass OpenGL in Qt 6 nicht mehr immer die Standardwahl für das Qt Quick Rendering ist. Sofern nicht das software
Backend verwendet wird, kann eine Qt Quick Anwendung OpenGL, Vulkan, Metal oder Direct3D 11 zur Laufzeit verwenden. Wenn keine explizite Anfrage gestellt wird, entweder über die Umgebungsvariable QSG_RHI_BACKEND
oder die Funktion QQuickWindow::setSceneGraphBackend(), wird ein plattformspezifischer Standard von Qt Quick gewählt.
Weitere Informationen finden Sie auf den Seiten Qt Quick Scene Graph und Qt Quick Scene Graph Default Renderer.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.