Die Änderungen an Qt Quick Controls
Qt 6 sind das Ergebnis des bewussten Bemühens, das Framework effizienter und benutzerfreundlicher zu gestalten.
Wir versuchen, die Kompatibilität für alle öffentlichen APIs in jeder Version zu erhalten. In dem Bemühen, Qt zu einem besseren Framework zu machen, waren einige Änderungen unvermeidlich.
In diesem Thema fassen wir diese Änderungen in Qt Quick Controls zusammen und geben Anleitungen zu deren Handhabung.
Umstellung von Qt Quick Controls 1
Qt Quick Controls 1 wurde in Qt 5.11 veraltet und wird in Qt 6.0 entfernt. Verwenden Sie stattdessen Qt Quick Controls (früher bekannt als Qt Quick Controls 2). Weitere Informationen finden Sie im Thema Qt 5.15: Qt Quick Controls vs Qt Quick Controls 1 in der Qt 5 Dokumentation.
Änderungen bei der Typregistrierung
Qt Quick Controls wurde in Qt 6 einigen großen, meist internen Änderungen unterzogen. Durch die Verwendung der verbesserten Typregistrierung, die in Qt 5.15 eingeführt wurde, ebnen wir den Weg für die Kompilierung der QML-Dateien des Moduls nach C++ und ermöglichen eine effektivere Werkzeugentwicklung. Insbesondere sollte das QML-Codemodell von Qt Creator ein vollständigeres Bild der Typen haben, was die Vervollständigung und Fehlerprüfung von Qt Quick Controls Code zuverlässiger macht. Statische Analysewerkzeuge wie qmllint und qmlformat profitieren ebenfalls davon, dass sie sich der Typen bewusst werden, die jetzt zur Kompilierzeit in C++ deklariert werden.
Als Ergebnis dieser Änderungen werden einige Dinge ein wenig anders gehandhabt.
Benutzerdefinierte Stile sind jetzt richtige QML-Module
Um die Typregistrierung zur Kompilierzeit zu ermöglichen, ist jeder Qt Quick Controls Stil jetzt ein eigenes QML-Modul. Zuvor reichte ein einziges Button.qml
aus, um einen eigenen Stil zu erstellen. Dies war zwar praktisch, erforderte aber eine nicht standardisierte API, die wiederum Anpassungen in Werkzeugen wie Qt Designer erforderte.
Jetzt müssen alle QML-Typen, die ein Stil implementiert, in der qmldir-Datei des Stils deklariert werden:
module MyStyle Button 1.0 Button.qml
Durch die Vereinheitlichung mit dem Rest der QML-Welt werden Stile für Entwickler vertrauter und hoffentlich auch für Anfänger leichter zu verstehen. Infolgedessen musste die folgende API entfernt werden:
- QQuickStyle::addStylePath()
- QQuickStyle::availableStyles()
- QQuickStyle::pfad()
- QQuickStyle::stylePathList()
- QT_QUICK_CONTROLS_STYLE_PFAD
Da die Stile nun wie jedes andere QML-Modul im Importpfad der QML-Engine gefunden werden müssen, ist es nicht mehr notwendig oder möglich, diese API zu unterstützen.
Namen der Stile
Außerdem gibt es jetzt nur noch eine gültige Form für Stilnamen, bei der Groß- und Kleinschreibung unterschieden wird: "Material", "MyStyle" und so weiter. Das heißt: Der Stilname muss genau mit dem Namen des QML-Moduls übereinstimmen. Dies gilt auch für Dateiselektoren, bei denen bisher alle Stilnamen klein geschrieben wurden. Zum Beispiel war die folgende Struktur für ein Qt 5-Projekt gültig:
MyProject ├── main.qml ├── HomePage.qml └── +material └───HomePage.qml
In Qt 6 wird +material
zu +Material
:
MyProject ├── main.qml ├── HomePage.qml └── +Material └───HomePage.qml
Alle bestehenden Möglichkeiten, eine Anwendung mit einem bestimmten Stil auszuführen, werden weiterhin unterstützt.
Stilauswahl zur Laufzeit und Kompilierzeit
Das Importieren eines Stils hat nun eine zusätzliche Bedeutung aufgrund der Art und Weise, wie Importe intern funktionieren. Bisher wurden durch den Import von QtQuick.Controls
die Kontrolltypen des aktuellen Stils in der QML-Engine registriert:
import QtQuick.Controls
Wir bezeichnen dies als Stilauswahl zur Laufzeit, da der Stil zur Laufzeit ausgewählt wird.
Der explizite Import von QtQuick.Controls.Material
würde dann einfach alle zusätzlichen APIs freilegen, die von diesem Stil bereitgestellt werden (z. B. den angehängten Materialtyp):
import QtQuick.Controls.Material
Durch den expliziten Import eines Stils wird nun beides erreicht.
Dies bedeutet, dass die Steuerelementtypen (z. B. Button) des zuletzt importierten Stils verwendet werden. Wir bezeichnen dies als Kompilierzeit-Stilauswahl.
Dies hat Auswirkungen auf bestehenden Code. Wenn Ihre Anwendung nämlich mehr als einen Stil unterstützt, sollten Sie diese Importe in eigene QML-Dateien verschieben, die als Datei ausgewählt werden.
Wenn Sie zum Beispiel die folgende main.qml
haben:
import QtQuick.Controls import QtQuick.Controls.Material import QtQuick.Controls.Universal ApplicationWindow { width: 600 height: 400 visible: true Material.theme: darkMode ? Material.Dark : Material.Light Universal.theme: darkMode ? Universal.Dark : Universal.Light // Child items, etc. }
Sie können den gemeinsamen Code in eine "Basis"-Komponente verschieben:
// MainWindow.qml import QtQuick.Controls ApplicationWindow {}
Fügen Sie dann ein Unterverzeichnis +Material
hinzu, und fügen Sie darin den materialspezifischen Code in MainWindow.qml
ein:
// +Material/MainWindow.qml import QtQuick.Controls.Material ApplicationWindow { Material.theme: darkMode ? Material.Dark : Material.Light }
Machen Sie dasselbe für Universal:
// +Universal/MainWindow.qml import QtQuick.Controls.Universal ApplicationWindow { Universal.theme: darkMode ? Universal.Dark : Universal.Light }
Fügen Sie dann in main.qml
:
import QtQuick.Controls MainWindow { width: 600 height: 400 visible: true // Child items, etc. }
Siehe auch: Verwendung von Dateiauswahlen mit Qt Quick Controls.
Standard-Stil
Der Standardstil wurde in "Basic" umbenannt, da er nicht mehr der Standardstil ist. Stattdessen wird der Standardstil jetzt auf der Grundlage der Plattform ausgewählt, für die Qt entwickelt wurde:
- Android: Material-Stil
- Linux: Fusion-Stil
- macOS: macos-Stil
- Windows: Windows-Stil
- Alle anderen Plattformen: Basic-Stil
Daher sollten Anwendungen, die in Qt 5 keinen Stil spezifiziert haben und über angepasste Steuerelemente verfügen, in Qt 6 explizit den Basic-Stil spezifizieren, um sicherzustellen, dass diese Steuerelemente so aussehen und sich so verhalten, wie sie es in Qt 5 taten.
Palette
Die Paletten-API wurde nach QQuickItem verschoben. Die verschiedenen APIs, die Paletten in Qt Quick Controls verwenden, sind unverändert.
Steuerelemente
Änderungen an ApplicationWindow
Die veralteten Overlay-Eigenschaften und die angehängte API wurden entfernt. Verwenden Sie stattdessen den Typ Overlay attached.
Änderungen an ComboBox
Die Eigenschaft pressed ist jetzt schreibgeschützt. Um den visuell gedrückten Zustand eines ComboBox zu ändern, verwenden Sie stattdessen die Eigenschaft down.
Änderungen an Container
Die veraltete Funktion removeItem(var)
wurde entfernt. removeItem(Item) oder takeItem(int) können stattdessen verwendet werden.
Änderungen an Dialog
DialogDie Signale accepted() und rejected() werden jetzt vor closed() ausgegeben, wenn done(), accept() und reject() aufgerufen werden.
Änderungen an Menu
Die veraltete Funktion removeItem(var)
wurde entfernt. removeItem(Item) oder takeItem(int) können stattdessen verwendet werden.
Änderungen an ToolTip
ToolTipDie Zeitüberschreitung von ToolTip beginnt jetzt erst, nachdem opened() ausgegeben worden ist. Dies führt dazu, dass Tooltips mit Enter-Übergängen während der gesamten Dauer der Timeout-Eigenschaft sichtbar sind. Das bedeutet, dass sie etwas länger sichtbar sind als vorher. Es kann sich also lohnen, Tooltips in Ihrer Anwendung visuell zu überprüfen und die Timeouts gegebenenfalls anzupassen.
Änderungen an StackView
Der Enum-Wert StackView.Transition wurde veraltet. Das Argument operation kann weggelassen werden, um den Standardübergang für eine bestimmte Operation zu verwenden.
Änderungen an Tumbler
implicitWidth und implicitHeight müssen nun für Tumbler's contentItem bereitgestellt werden, wodurch sie mit allen anderen Steuerelementen konsistent sind.
© 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.