Änderungen an Qt Quick
Qt 6 sind das Ergebnis bewusster Bemühungen, das Framework effizienter und benutzerfreundlicher zu gestalten.
Wir bemühen uns, bei jeder Version die Binär- und Quellkompatibilität für alle öffentlichen APIs zu gewährleisten. Einige Änderungen waren jedoch unvermeidlich, um Qt zu einem besseren Framework zu machen.
In diesem Thema fassen wir diese Änderungen unter Qt Quick zusammen und geben Hinweise 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 Gewichts-Klassen existieren weiterhin, aber es ist nun möglich, beliebige Ganzzahlen zu verwenden, um Schriftarten auszuwählen, die keiner dieser Gewichts-Klassen entsprechen. Dies gewährleistet die Übereinstimmung mit der C++-API, in der es schon immer möglich war, das Schriftgewicht als beliebige Ganzzahl auszudrücken.
Der Großteil des Codes bleibt von dieser Änderung unberührt, außer in Fällen, in denen eine implizite Konvertierung von einer Zeichenkette in einen Enum-Wert verwendet wurde.
font.weight: "Bold"Dieser Code wird nicht mehr korrekt ausgewertet und muss durch den entsprechenden Enum-Wert ersetzt werden, wie unten gezeigt.
font.weight: Font.Bold„FontLoader.name“ ist nun eine schreibgeschützte Eigenschaft
In Qt 5 war die Eigenschaft „ name “ von „ FontLoader “ beschreibbar und überschrieb bei ihrer Festlegung die „source“-Eigenschaft des Elements. Dies führte zu Verwirrung hinsichtlich ihres Zwecks und konnte zu unvorhersehbarem Verhalten führen, wenn es zu einer Race-Condition zwischen den Settern der miteinander in Konflikt stehenden Eigenschaften kam.
Das bedeutet, dass Code wie der folgende nicht mehr funktioniert.
FontLoader {
id: fontLoader
name: "Helvetica"
}
Text {
font.family: fontLoader.name
text: "Foobar"
}Verwenden Sie stattdessen eine benutzerdefinierte Eigenschaft, um die Namen von Schriftfamilien zu speichern.
property string fontName: "Helvetica"
Text {
font.family: fontName
text: "Foobar"
}Der QML-Typ „OpenGLInfo“ wurde entfernt
In Qt 5.8 wurde „OpenGLInfo“ als veraltet markiert und in 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 mit den Tools aus dem Qt-Modul „ Shader Tools “ vorverarbeitet werden, beispielsweise mit dem Befehlszeilentool „ qsb “, um sicherzustellen, dass die Shader-Assets unabhängig davon verwendet werden können, welche Grafik-API (Vulkan, Metal, OpenGL oder Direct 3D) zur Laufzeit zum Einsatz kommt. „ ShaderEffect “-Elemente sollten auf die resultierenden „ .qsb “-Dateien verweisen.
Die ShaderEffect-Quelleneigenschaften sind nun URLs
Die „ ShaderEffect “-Eigenschaften „ vertexShader “ und „ fragmentShader “ haben nun beide den Typ „ QUrl “ anstelle von „ QByteArray “. Ihr Verhalten entspricht daher dem anderer ähnlicher Eigenschaften, wie beispielsweise „ Image.source “. Bestehender Code, der über das Schema „ file “ oder „ qrc “ auf Dateien verweist, funktioniert weiterhin unverändert. Darüber hinaus ermöglicht diese Änderung das Verweisen auf Dateien mit einem Pfad, der relativ zum Speicherort der Komponente (der .qml-Datei) ist. Die Angabe des Schemas „ file: “ ist daher nun optional.
Änderungen an den C++-APIs von „ Qt Quick “
Änderungen an den C++-APIs von „xml-ph-0000@deepl.internal“
QQuickItemDie Funktion `geometryChanged()` wurde in ` geometryChange()` umbenannt.
Änderungen an den QQuick*-APIs
- Anwendungen, die ihre eigenen Vulkan-, Metal- oder Direct3D-Rendering-Befehle integrieren möchten, sollten neben „ QQuickWindow::beforeRendering()“ und „afterRendering()“ auch die neuen „ QQuickWindow “-Signale berücksichtigen. Das bisherige Qt-5-Muster, bei dem lediglich eine Verbindung zu „beforeRendering“ oder „afterRendering“ hergestellt wird, reicht oft nicht mehr aus und muss wahrscheinlich durch die Anbindung an zusätzliche Signale wie „ beforeRenderPassRecording “ oder „ afterRenderPassRecording “ ergänzt werden.
- Anwendungen, die auf die Signale „ QQuickWindow::beforeRendering()“ oder „afterRendering()“ zurückgreifen, um eigene OpenGL-Renderbefehle auszuführen, sollten vor den OpenGL-Aufrufen „ QQuickWindow::beginExternalCommands()“ und danach „ QQuickWindow::endExternalCommands()“ aufrufen. Dadurch wird sichergestellt, dass durch den Anwendungscode vorgenommene Zustandsänderungen nicht zu Verwirrung hinsichtlich des vom Szenengraph-Renderer selbst zwischengespeicherten Zustands führen. Beachten Sie jedoch, dass – genau wie in Qt 5 – das Ändern von OpenGL-3.x- oder 4.x-Zuständen, die vom „ Qt Quick “-Renderer nicht verwendet werden, weiterhin zu unerwarteten Problemen führen kann. Daher wird empfohlen, solche OpenGL-Zustände auf den Standardwert zurückzusetzen, bevor aus den mit diesen Signalen verbundenen Slots oder Lambdas zurückgekehrt wird.
- Die bestehenden Überladungen von ` QQuickWindow::setRenderTarget()` sowie die zugehörigen Getter wurden entfernt und durch eine neue Funktion ersetzt, die ein ` QQuickRenderTarget`-Objekt entgegennimmt. Anwendungen, die umgeleitetes Rendering in Kombination mit ` QQuickRenderControl ` durchführen, sollten nun diese neue Funktion verwenden, um das Renderziel auf eine Weise anzugeben, die nicht an OpenGL gebunden ist.
- Die Überladung von ` QQuickWindow::setSceneGraphBackend()` mit einem ` QSGRendererInterface::GraphicsApi `-Argument wurde in ` setGraphicsApi()` umbenannt.
- Die Funktionen „ QQuickWindow “ setPersistentOpenGLContext und isPersistentOpenGLContext wurden umbenannt und heißen nun „ QQuickWindow::setPersistentGraphics()“ und „ QQuickWindow::isPersistentGraphics()“.
- setClearBeforeRendering() und clearBeforeRendering() wurden aus „ QQuickWindow “ entfernt. In Qt 6 gibt es keine Option mehr, das Löschen des Farbpuffers zu überspringen. Der Aufruf von setClearBeforeRendering() war in Qt 5 in Kombination mit Underlays oft notwendig, um zu verhindern, dass „ Qt Quick “ den in den Farbpuffer gerenderten Inhalt löscht. In Qt 6 gibt es einen robusteren Ansatz: die Anbindung an das Signal „
beforeRenderPassRecording()“, das nach dem Löschen, aber vor dem Rendern des Inhalts von ` Qt Quick` ausgelöst wird. - Die Funktion `QQuickWindow::openglContext()` wurde entfernt. Sobald die Anwendung sichergestellt hat, dass der Szenengraph OpenGL für das Rendern verwendet, kann sie den ` QOpenGLContext ` über ` QSGRendererInterface::getResource()` abfragen.
- Das Signal `QQuickWindow::openglContextCreated()` wurde entfernt.
- Die veraltete Funktion `QQuickWindow::createTextureFromId()` wurde entfernt. Verwenden Sie stattdessen die Funktion `fromNative()` aus `QPlatformInterface::QSGOpenGLTexture`, `QPlatformInterface::QSGVulkanTexture`, `QPlatformInterface::QSGD3D11Texture` oder `QPlatformInterface::QSGMetalTexture`.
- Die Klasse ` QQuickFramebufferObject ` ist mit unveränderter API verfügbar, funktioniert jedoch nur, wenn der Szenengrafikbaum mit OpenGL gerendert wird. Bei Verwendung einer anderen Grafik-API wie Vulkan oder Metal funktioniert sie nicht. Anwendungen, die auf ` QQuickFramebufferObject ` angewiesen sind, sollten die Verwendung von OpenGL erzwingen, indem sie in ihrer `main()`-Funktion `
QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL)` aufrufen. - QQuickRenderControl verfügt über eine leicht geänderte API: grab() wurde entfernt; verwenden Sie stattdessen, sofern zutreffend, QQuickWindow::grabWindow(). Die Funktion initialize() akzeptiert kein QOpenGLContext mehr. Anwendungen müssen nun außerdem je nach Bedarf QQuickRenderControl::beginFrame() und QQuickRenderControl::endFrame() aufrufen. 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 Kontext-Objekt durchführen möchten, müssen die neue Funktion „ QQuickWindow::setGraphicsDevice()“ verwenden, da „ QQuickRenderControl “ die Funktion „
initialize(QOpenGLContext*)“ nicht mehr bereitstellt. - Das Setzen von „ QQuickPaintedItem “ und „ Context2D “ auf den Modus „
Framebuffer“ hat keine Auswirkung. Es verhält sich so, als wäre der Modus auf den Standardmodus „Image“ gesetzt. - Die Umgebungsvariable
QSG_NO_DEPTH_BUFFERwird in Qt 6.0 weiterhin unterstützt, es wird jedoch empfohlen, ihre Verwendung durch den Aufruf von setDepthBufferFor2D() auf einem QQuickGraphicsConfiguration zu ersetzen, das dann mit dem QQuickWindow verknüpft wird.
Änderungen an den QSG*-APIs
- QSGMaterialShader hat eine geänderte Schnittstelle. Implementierungen sollten sich nicht mehr auf OpenGL stützen und dürfen nicht davon ausgehen, dass Funktionen wie das nun entfernte `updateState()` mit einem aktuellen ` QOpenGLContext ` aufgerufen werden. In der neuen, datenorientierten Schnittstelle wird `updateState()` durch ` updateUniformData()`, ` updateSampledImage()` und ` updateGraphicsPipelineState()` ersetzt. Anstelle von als Zeichenketten bereitgestelltem GLSL-Shader-Code wird nun erwartet, dass Shader von den Tools des Qt-Moduls „ Shader Tools “ vorverarbeitet werden, beispielsweise durch das Befehlszeilentool „
qsb“. Dadurch wird sichergestellt, dass die Shader-Assets unabhängig davon verwendet werden können, welche Grafik-API (Vulkan, Metal, OpenGL oder Direct 3D) zur Laufzeit zum Einsatz kommt. - QSGEngine wurde entfernt. Für den unwahrscheinlichen Fall, dass eine Anwendung diese Klasse nutzt, wird empfohlen, stattdessen auf die Verwendung von „ QQuickRenderControl “ umzusteigen.
- „QSGAbstractRenderer“ ist nicht mehr öffentlich. Die Verwendung dieser Klasse war nur in Kombination mit „QSGEngine“ sinnvoll; da diese Klasse entfernt wurde, wurde „QSGAbstractRenderer“ wieder auf „privat“ gesetzt.
- Die Komfortklasse `QSGSimpleMaterial` wurde entfernt. Anwendungen sollten stattdessen die überarbeiteten, OpenGL-unabhängigen ` QSGMaterial `-APIs verwenden.
- Um auf das zugrunde liegende native Texturobjekt für ein „ QSGTexture “ zuzugreifen, steht „textureId()“ nicht mehr zur Verfügung. Verwenden Sie stattdessen `QSGTexture::platformInterface()` mit `QPlatformInterface::QSGOpenGLTexture`, `QPlatformInterface::QSGVulkanTexture`, `QPlatformInterface::QSGD3D11Texture` oder `QPlatformInterface::QSGMetalTexture`.
- Unterklassen von ` QSGImageNode ` müssen nun neue zusätzliche virtuelle Funktionen überschreiben, wie beispielsweise `setAnisotropyLevel()` und `anisotropyLevel()`.
- Unterklassen von ` QSGTexture ` müssen wahrscheinlich neu gestaltet werden. Einige der OpenGL-spezifischen virtuellen Funktionen, wie z. B. `bind()` oder `updateBindOptions()`, sind nicht mehr vorhanden, während es neue virtuelle Funktionen gibt, deren Implementierung obligatorisch ist, wie z. B. ` comparisonKey()`.
Änderungen bei der Verwendung von OpenGL in Qt Quick
Auch wenn dies für viele Anwendungen keine Probleme mit sich bringt, sollten Anwendungsentwickler sich bewusst sein, dass OpenGL in Qt 6 nicht mehr immer die Standardwahl für das Rendering mit „ Qt Quick “ ist. Sofern nicht das „ software “-Backend verwendet wird, könnte eine „ Qt Quick “-Anwendung zur Laufzeit OpenGL, Vulkan, Metal oder Direct3D 11 nutzen. Wenn keine explizite Anforderung erfolgt – weder über die Umgebungsvariable „ QSG_RHI_BACKEND “ noch über die Funktion „ QQuickWindow::setSceneGraphBackend()“ –, wird von „ Qt Quick “ eine plattformspezifische Standardeinstellung ausgewählt.
Weitere Informationen finden Sie auf den Seiten „Qt Quick: Szenengraph “ und „Qt Quick: Standard-Renderer für den Szenengraphen “.
© 2026 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.