Änderungen an Qt Qml
Qt 6 ist das Ergebnis der bewussten Bemühungen, 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. Aber einige Änderungen waren unvermeidlich, um Qt zu einem besseren Framework zu machen.
In diesem Thema fassen wir diese Änderungen in Qt QML zusammen und geben Anleitungen zu deren Handhabung.
QML-Sprache
URL-Auflösung
In Qt 5 wurden relative URLs oft, wenn auch uneinheitlich, direkt aufgelöst, insbesondere wenn sie einer url-Eigenschaft zugewiesen waren. In Qt 6 ist dies nicht mehr der Fall.
Wenn Sie eine QML-Datei haben, die unter "/home/qml/example.qml" gespeichert ist, und "example.qml" enthält
property url imageFolder: "./images"
enthielt, 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. In Qt 6 bleibt die URL daher relativ und wird nur aufgelöst, wenn dies erforderlich ist (z.B. wenn sie als Quelle einer Bildkomponente verwendet wird). Wenn Sie auf das alte Verhalten angewiesen sind, können Sie Qt.resolvedUrl
Wenn Sie zum Beispiel einen Code wie
property url imageFolder: "./images"
haben, können Sie ihn umschreiben als
property url imageFolder: Qt.resolvedUrl("./images")
Qt.resolvedUrl kann sowohl in Qt 5 als auch in 6 verwendet werden.
Abweichende Eigenschaften
variant
Eigenschaften, die seit Qt 5 als veraltet gekennzeichnet sind, werden nun genauso behandelt wie var
Eigenschaften. Code, der sich auf die implizite Stringkonvertierung bei der Zuweisung von Variant Properties verlassen hat, sollte aktualisiert werden, um explizit ein Objekt des richtigen Typs zu erzeugen.
Wenn Sie zum Beispiel einen Code wie
property variant myColor: "red"
haben, können Sie ihn umschreiben als
property variant myColor: Qt.color("red")
Implizite Konvertierungen wurden für Strings durchgeführt, die geparst werden konnten als
- color (verwenden Sie stattdessen Qt.color),
- date (verwenden Sie stattdessen das Date-Objekt),
- rect (verwenden Sie stattdessen Qt.rect) und
- size (verwenden Sie stattdessen Qt.size)
variant
bleibt auch in Qt 6 ein veraltetes Schlüsselwort, obwohl neuer Code dringend empfohlen wird, stattdessen var
properties zu verwenden.
Hinweis: Wenn bekannt ist, dass sich der Typ der Eigenschaft nicht ändern wird, verwenden Sie eine Eigenschaft des konkreten Typs anstelle einer var
Eigenschaft.
Hinweis: Diese Konvertierungen wurden auch auf QVariant
Eigenschaften von Klassen angewendet, die in der Engine registriert sind. Wie bei variant
properties muss Code, der sich auf implizite String-Konvertierungen verlässt, die entsprechenden Funktionen des Qt-Objekts verwenden.
Quellinkompatible API-Änderungen
Geänderte API
QQmlListProperty
CountFunction
und wurden geändert, um anstelle von zu verwenden, um mit den entsprechenden Änderungen in den Qt-Containern übereinzustimmen. AtFunction
qsizetype
int
Wenn Sie zum Beispiel einen Code wie
int myCountFunction(QQmlListProperty<MyType> *); MyType *myAtFunction(QQmlListProperty<MyType> *, int); QQmlListProperty<MyType> myReadOnlyList(containingObject, container, &myCountFunction, &myAtFunction);
haben, können Sie ihn umschreiben als
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 ein Typedef verwenden, das int
in Qt 5 und qsizetype
in Qt 6 ist, oder QList::size_type
verwenden, das bereits ein solcher Typ-Alias ist.
Entfernte API
Verschiedene veraltete Funktionen wurden entfernt.
- Der QQmlListProperty Konstruktor, der eine Referenz annimmt, wurde entfernt.
Zum Beispiel, wenn Sie Code haben wie
QQmlListProperty<QObject>(owner, owner->objectList);
haben, können Sie ihn umschreiben als
QQmlListProperty<QObject>(owner, &owner->objectList);
- Die Funktionen
qmlDebug
,qmlInfo
,qmlWarning
,qmlContext
undqmlEngine
existierten früher sowohl im globalen Namespace (oder Qt Namespace in Namespaced Builds), als auch imQtQml
Namespace. Diese Funktionen existieren jetzt nur noch im globalen Namensraum.Zum Beispiel, wenn Sie Code wie
QQmlEngine *engine = QtQml::qmlEngine(qmlObject);
haben, können Sie ihn umschreiben als
QQmlEngine *engine = qmlEngine(qmlObject);
- Die Überladung
qmlRegisterType
, die keine Argumente annimmt, wurde entfernt. Verwenden Sie stattdessenqmlRegisterAnonymousType
, oder wechseln Sie zur deklarativen Typregistrierung mitQML_ANONYMOUS
.Zum Beispiel, wenn Sie Code haben wie
class AnonymousType : public QObject { // ... }; qmlRegisterType<AnonymousType>();
haben, können Sie ihn umschreiben als
class AnonymousType : public QObject { // ... }; qmlRegisterAnonymousType<AnonymousType>("MyModule", 1);
Oder alternativ
class AnonymousType : public QObject { QML_ANONYMOUS // ... };
- Die Überladungen von
qmlRegisterExtendedType
undqmlRegisterInterface
, die kein Versionsargument annehmen, wurden entfernt. Verwenden Sie die Überladungen, die eine Version angeben, oder wechseln Sie zur deklarativen Typregistrierung mit QML_EXTENDED und QML_INTERFACE.Zum Beispiel, wenn Sie Code haben wie
struct GreetInterface { virtual ~GreetInterface(); virtual void greet(); }; Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface") qmlRegisterInterface<GreetInterface>("Greeter");
haben, können Sie ihn umschreiben als
struct GreetInterface { virtual ~GreetInterface(); virtual void greet(); }; Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface") qmlRegisterInterface<GreetInterface>("Greeter", 1);
Alternativ dazu
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 der Zugriff auf die Engine erforderlich ist, muss stattdessen ein Verweis auf sie gespeichert werden. qmlAttachedPropertiesObjectById
undqmlAttachedPropertiesObject(int *, const QObject *, const QMetaObject *, bool)
wurden entfernt. Verwenden Sie stattdessen die ÜberladungqmlAttachedPropertiesObject(QObject *, QQmlAttachedPropertiesFunc, bool)
vonqmlAttachedPropertiesObject
.QJSEngine::installTranslatorFunctions
wurde entfernt.QJSEngine::installExtensions
ist als Ersatz verfügbar.Zum Beispiel, wenn Sie Code haben wie
QJSEngine engine; engine.installTranslatorFunctions();
haben, können Sie ihn umschreiben als
© 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.