Änderungen an Qt Qml
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 aufrechtzuerhalten. Einige Änderungen waren jedoch unvermeidlich, um Qt zu einem besseren Framework zu machen.
In diesem Thema fassen wir diese Änderungen in „ Qt Qml “ zusammen und geben Hinweise zum Umgang damit.
QML-Sprache
URL-Auflösung
In Qt 5 wurden relative URLs oft – wenn auch nicht konsistent – direkt aufgelöst, insbesondere wenn sie einer URL-Eigenschaft zugewiesen wurden. In Qt 6 ist dies nicht mehr der Fall.
Wenn Sie eine QML-Datei unter „/home/qml/example.qml“ gespeichert hatten und „example.qml“ Folgendes enthielt
property url imageFolder: "./images"dann würde die URL-Eigenschaft die URL „/home/qml/images“ speichern. Dies machte es unmöglich, relative URLs in QML auf diese Weise zu verwenden. Daher bleibt die URL in Qt 6 relativ und wird nur aufgelöst, wenn dies erforderlich ist (z. B. wenn sie als Quelle einer Image-Komponente verwendet wird). Wenn Sie auf das alte Verhalten angewiesen sind, können Sie Folgendes verwenden Qt.resolvedUrl
Wenn Sie beispielsweise folgenden Code haben
property url imageFolder: "./images"können Sie ihn wie folgt umschreiben
property url imageFolder: Qt.resolvedUrl("./images")„Qt.resolvedUrl“ kann sowohl in Qt 5 als auch in Qt 6 verwendet werden.
Als Portierungshilfe kann die Umgebungsvariable „ QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT “ auf 1 gesetzt werden, um das Verhalten von Qt 5 zu erhalten. Dies ist seit Qt 6.2.2 möglich. Es wird jedoch empfohlen, dies nur zur Überbrückung einer Portierung zu nutzen und stattdessen „ Qt.resolvedUrl “ wie oben beschrieben zu verwenden.
Varianteneigenschaften
variant Eigenschaften, die seit Qt 5 als veraltet markiert sind, werden nun genau wie „ var “-Eigenschaften behandelt. Code, der sich auf implizite Zeichenfolgenkonvertierungen stützte, die bei der Zuweisung an „Variant“-Eigenschaften ausgelöst wurden, sollte aktualisiert werden, um explizit ein Objekt des richtigen Typs zu erstellen.
Wenn Sie beispielsweise folgenden Code haben
property variant myColor: "red"können Sie ihn wie folgt umschreiben
property variant myColor: Qt.color("red")Implizite Konvertierungen wurden für Zeichenfolgen durchgeführt, die als
- Farbe (verwenden Sie stattdessen Qt.color),
- date (verwenden Sie stattdessen das Date-Objekt),
- „rect“ (verwenden Sie stattdessen Qt.rect) und
- Größe (verwenden Sie stattdessen „Qt.size“)
variant ist in Qt 6 nach wie vor ein veraltetes Schlüsselwort, allerdings wird dringend empfohlen, in neuem Code stattdessen „ var “-Eigenschaften zu verwenden.
Hinweis: Wenn bekannt ist, dass sich der Typ der Eigenschaft nicht ändert, verwenden Sie eine Eigenschaft des konkreten Typs anstelle einer „ var “-Eigenschaft.
Hinweis: Diese Umwandlungen wurden auch auf „ QVariant “-Eigenschaften von Klassen angewendet, die bei der Engine registriert sind. Wie bei „ variant “-Eigenschaften muss Code, der auf implizite Zeichenfolgenkonvertierungen angewiesen war, nun die entsprechenden Funktionen des Qt-Objekts verwenden.
Quellinkompatible API-Änderungen
Geänderte API
QQmlListPropertyDie Eigenschaften „ CountFunction “ und „ AtFunction “ wurden so geändert, dass nun „ qsizetype “ anstelle von „ int “ verwendet wird, um sie an die entsprechenden Änderungen in den Qt-Containern anzupassen.
Wenn Sie beispielsweise folgenden Code haben
int myCountFunction(QQmlListProperty<MyType> *);
MyType *myAtFunction(QQmlListProperty<MyType> *, int);
QQmlListProperty<MyType> myReadOnlyList(containingObject, container, &myCountFunction,
&myAtFunction);können Sie diesen wie folgt umschreiben:
qsizetype myCountFunction(QQmlListProperty<MyType> *);
MyType *myAtFunction(QQmlListProperty<MyType> *, qsizetype);
QQmlListProperty<MyType> myReadOnlyList(containingObject, container, &myCountFunction,
&myAtFunction);Code, der sowohl Qt 5 als auch Qt 6 unterstützen muss, kann entweder einen `typedef` verwenden, der in Qt 5 ` int ` und in Qt 6 ` qsizetype ` lautet, oder ` QList::size_type` nutzen, das bereits einen solchen Typalias darstellt.
Entfernte API
Verschiedene veraltete Funktionen wurden entfernt.
- Der Konstruktor „ QQmlListProperty “, der eine Referenz entgegennimmt, wurde entfernt.
Wenn Sie beispielsweise folgenden Code haben:
QQmlListProperty<QObject>(owner, owner->objectList);können Sie diesen wie folgt umschreiben:
QQmlListProperty<QObject>(owner, &owner->objectList); - Die Funktionen
qmlDebug,qmlInfo,qmlWarning,qmlContextundqmlEngineexistierten früher sowohl im globalen Namensraum (oder im Qt-Namensraum bei Builds mit Namensräumen) als auch im Namensraum „QtQml“. Diese Funktionen existieren nun nur noch im globalen Namensraum.Wenn Sie beispielsweise folgenden Code haben:
QQmlEngine *engine = QtQml::qmlEngine(qmlObject);können Sie ihn wie folgt umschreiben:
QQmlEngine *engine = qmlEngine(qmlObject); - Die Überladung von `
qmlRegisterType` ohne Argumente wurde entfernt. Verwenden Sie stattdessen `qmlRegisterAnonymousType` oder wechseln Sie zur deklarativen Typregistrierung mit `QML_ANONYMOUS`.Wenn Sie beispielsweise folgenden Code haben:
class AnonymousType : public QObject { // ... }; qmlRegisterType<AnonymousType>();können Sie diesen wie folgt umschreiben:
class AnonymousType : public QObject { // ... }; qmlRegisterAnonymousType<AnonymousType>("MyModule", 1);Oder alternativ
class AnonymousType : public QObject { QML_ANONYMOUS // ... }; - Die Überladungen von `
qmlRegisterExtendedType` und `qmlRegisterInterface`, die kein Versionsargument entgegennehmen, wurden entfernt. Verwenden Sie die Überladungen, die eine Version vorgeben, oder wechseln Sie zur deklarativen Typregistrierung mit ` QML_EXTENDED ` und ` QML_INTERFACE`.Wenn Sie beispielsweise folgenden Code haben:
struct GreetInterface { virtual ~GreetInterface(); virtual void greet(); }; Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface") qmlRegisterInterface<GreetInterface>("Greeter");können Sie diesen wie folgt umschreiben:
struct GreetInterface { virtual ~GreetInterface(); virtual void greet(); }; Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface") qmlRegisterInterface<GreetInterface>("Greeter", 1);Alternativ
struct GreetInterface { QML_INTERFACE(Greeter) virtual ~GreetInterface(); virtual void greet(); }; Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface")Hinweis: In neuem Code sollte die deklarative Typregistrierung bevorzugt werden.
- Die Funktion „
QJSValue::engine“ wurde entfernt. Wenn ein Zugriff auf die Engine erforderlich ist, muss stattdessen eine Referenz darauf gespeichert werden. qmlAttachedPropertiesObjectByIdund `qmlAttachedPropertiesObject(int *, const QObject *, const QMetaObject *, bool)` wurden entfernt. Verwenden Sie stattdessen die Überladung `qmlAttachedPropertiesObject(QObject *, QQmlAttachedPropertiesFunc, bool)` von `qmlAttachedPropertiesObject`.QJSEngine::installTranslatorFunctionswurde entfernt. Als Ersatz steht „QJSEngine::installExtensions“ zur Verfügung.Wenn Sie beispielsweise folgenden Code haben:
QJSEngine engine; engine.installTranslatorFunctions();können Sie diesen wie folgt umschreiben:
Siehe auch „Modernisierung von QML-Modulen “ und „Portierung von QML-Modulen nach CMake“.
© 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.