Ä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 und qmlEngine existierten früher sowohl im globalen Namespace (oder Qt Namespace in Namespaced Builds), als auch im QtQml 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 stattdessen qmlRegisterAnonymousType, oder wechseln Sie zur deklarativen Typregistrierung mit QML_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 und qmlRegisterInterface, 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 und qmlAttachedPropertiesObject(int *, const QObject *, const QMetaObject *, bool) wurden entfernt. Verwenden Sie stattdessen die Überladung qmlAttachedPropertiesObject(QObject *, QQmlAttachedPropertiesFunc, bool) von qmlAttachedPropertiesObject.
  • 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

    QJSEngine engine;
    engine.installExtensions(QJSEngine::TranslationExtension);

© 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.