Sur cette page

Changements apportés à Qt Qml

Qt 6 est le résultat d'un effort conscient pour rendre le cadre plus efficace et plus facile à utiliser.

Nous essayons de maintenir la compatibilité binaire et source pour toutes les API publiques dans chaque version. Mais certains changements étaient inévitables dans un effort pour faire de Qt un meilleur framework.

Dans cette rubrique, nous résumons ces changements dans Qt Qml, et fournissons des conseils pour les gérer.

Langage QML

Résolution des URL

Dans Qt 5, les urls relatives étaient souvent, bien que de manière incohérente, directement résolues, en particulier lorsqu'elles étaient assignées à une propriété url. Dans Qt 6, ce n'est plus le cas.

Si vous avez un fichier QML stocké sous "/home/qml/example.qml", et que "exemple.qml" contient

property url imageFolder: "./images"

alors la propriété url stockerait l'URL "/home/qml/images". Cela rendait impossible l'utilisation d'URL relatives dans Qt Qml de cette manière, donc dans Qt 6, l'URL reste relative, et n'est résolue que lorsque cela est nécessaire (par exemple lorsqu'elle est utilisée comme source d'un composant Image). Si vous dépendez de l'ancien comportement, vous pouvez utiliser Qt.resolvedUrl

Par exemple, si vous avez un code comme

property url imageFolder: "./images"

vous pouvez le réécrire comme suit

property url imageFolder: Qt.resolvedUrl("./images")

Qt.resolvedUrl peut être utilisé dans Qt 5 et 6.

Pour faciliter le portage, la variable d'environnement QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT peut être mise à 1 pour obtenir le comportement de Qt 5. Ceci est possible depuis Qt 6.2.2. Cependant, il est recommandé de n'utiliser cette variable que pour débloquer un port, et d'utiliser Qt.resolvedUrl comme expliqué ci-dessus.

Propriétés variantes

variant Les propriétés Variant, qui ont été marquées comme obsolètes depuis Qt 5, sont maintenant traitées exactement de la même manière que les propriétés var. Le code qui s'appuyait sur la conversion implicite de chaînes de caractères déclenchée lors de l'affectation à des propriétés variantes doit être mis à jour pour créer explicitement un objet du type correct.

Par exemple, si vous avez un code comme

property variant myColor: "red"

vous pouvez le réécrire comme suit

property variant myColor: Qt.color("red")

Des conversions implicites ont été effectuées pour les chaînes de caractères qui pouvaient être analysées comme suit

  • couleur (utiliser Qt.color à la place),
  • date (utiliser l'objet Date à la place),
  • rect (utiliser Qt.rect à la place) et
  • size (utiliser Qt.size à la place)

variant reste un mot-clé déprécié dans Qt 6, bien que le nouveau code soit fortement encouragé à utiliser les propriétés var à la place.

Note : Si le type de la propriété est connu pour ne pas changer, utilisez une propriété du type concret, au lieu d'une propriété var.

Note : Ces conversions ont également été appliquées aux propriétés QVariant des classes enregistrées avec le moteur. Comme pour les propriétés variant, le code qui s'appuyait sur des conversions implicites de chaînes de caractères doit utiliser les fonctions correspondantes de l'objet Qt XML.

Modifications de l'API incompatible avec la source

API modifiée

QQmlListProperty CountFunction et ont été modifiées pour utiliser au lieu de afin de s'aligner sur les changements correspondants dans les conteneurs de Qt. AtFunction qsizetype int

Par exemple, si vous avez du code comme

int myCountFunction(QQmlListProperty<MyType> *);
MyType *myAtFunction(QQmlListProperty<MyType> *, int);

QQmlListProperty<MyType> myReadOnlyList(containingObject, container, &myCountFunction,
                                        &myAtFunction);

vous pouvez le réécrire comme suit

qsizetype myCountFunction(QQmlListProperty<MyType> *);
MyType *myAtFunction(QQmlListProperty<MyType> *, qsizetype);

QQmlListProperty<MyType> myReadOnlyList(containingObject, container, &myCountFunction,
                                        &myAtFunction);

Le code qui doit supporter à la fois Qt 5 et Qt 6 peut soit utiliser un typedef qui est int dans Qt 5 et qsizetype dans Qt 6, soit utiliser QList::size_type, qui est déjà un tel alias de type.

API supprimée

Plusieurs fonctions obsolètes ont été supprimées.

  • Le constructeur QQmlListProperty prenant une référence a été supprimé.

    Par exemple, si vous avez du code comme

    QQmlListProperty<QObject>(owner, owner->objectList);

    vous pouvez le réécrire comme suit

    QQmlListProperty<QObject>(owner, &owner->objectList);
  • Les fonctions qmlDebug, qmlInfo, qmlWarning, qmlContext et qmlEngine existaient auparavant à la fois dans l'espace de noms global (ou dans l'espace de noms Qt dans les constructions à espace de noms) et dans l'espace de noms QtQml. Ces fonctions n'existent désormais que dans l'espace de noms global.

    Par exemple, si vous avez du code comme

    QQmlEngine *engine = QtQml::qmlEngine(qmlObject);

    vous pouvez le réécrire comme suit

    QQmlEngine *engine = qmlEngine(qmlObject);
  • La surcharge qmlRegisterType ne prenant aucun argument a été supprimée. Utilisez qmlRegisterAnonymousType à la place, ou passez à l'enregistrement de type déclaratif avec QML_ANONYMOUS.

    Par exemple, si vous avez un code comme

    class AnonymousType : public QObject {
      // ...
    };
    
    qmlRegisterType<AnonymousType>();

    vous pouvez le réécrire comme

    class AnonymousType : public QObject {
      // ...
    };
    
    qmlRegisterAnonymousType<AnonymousType>("MyModule", 1);

    Ou encore

    class AnonymousType : public QObject {
        QML_ANONYMOUS
        // ...
    };
  • Les surcharges de qmlRegisterExtendedType et qmlRegisterInterface qui ne prennent pas d'argument de version ont été supprimées. Utilisez les surcharges fournissant une version, ou passez à l'enregistrement de type déclaratif avec QML_EXTENDED et QML_INTERFACE.

    Par exemple, si vous avez un code comme

    struct GreetInterface
    {
       virtual ~GreetInterface();
       virtual void greet();
    };
    Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface")
    
    qmlRegisterInterface<GreetInterface>("Greeter");

    vous pouvez le réécrire comme

    struct GreetInterface
    {
       virtual ~GreetInterface();
       virtual void greet();
    };
    Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface")
    
    qmlRegisterInterface<GreetInterface>("Greeter", 1);

    Alternativement

    struct GreetInterface
    {
       QML_INTERFACE(Greeter)
       virtual ~GreetInterface();
       virtual void greet();
    };
    Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface")

    Note : Dans un nouveau code, l'enregistrement déclaratif des types doit être privilégié.

  • La fonction QJSValue::engine a été supprimée. Si l'accès au moteur est nécessaire, une référence à celui-ci doit être stockée à la place.
  • qmlAttachedPropertiesObjectById et qmlAttachedPropertiesObject(int *, const QObject *, const QMetaObject *, bool) ont été supprimées. Utilisez plutôt la surcharge qmlAttachedPropertiesObject(QObject *, QQmlAttachedPropertiesFunc, bool) de qmlAttachedPropertiesObject.
  • QJSEngine::installTranslatorFunctions a été supprimée. QJSEngine::installExtensions est disponible en remplacement.

    Par exemple, si vous avez un code comme

    QJSEngine engine;
    engine.installTranslatorFunctions();

    vous pouvez le réécrire comme suit

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

Voir aussi Moderniser les modules QML et Porter les modules QML vers 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.