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:

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.