Modifications apportées à Qt Qml
Qt 6 résultent d'un effort délibéré visant à rendre le framework plus efficace et plus facile à utiliser.
Nous nous efforçons de maintenir la compatibilité binaire et source pour toutes les API publiques à chaque version. Cependant, certaines modifications étaient inévitables afin d’améliorer le framework Qt.
Dans cette rubrique, nous résumons ces modifications dans « Qt Qml » et fournissons des conseils pour les prendre en compte.
Langage QML
Résolution des URL
Dans Qt 5, les URL relatives étaient souvent, bien qu’de manière incohérente, résolues directement, en particulier lorsqu’elles étaient attribuées à une propriété url. Dans Qt 6, ce n’est plus le cas.
Si vous aviez un fichier QML stocké sous « /home/qml/example.qml », et que « example.qml » contenait
property url imageFolder: "./images"alors la propriété url stockait l’URL « /home/qml/images ». Cela rendait impossible l’utilisation des URL relatives dans Qml de cette manière ; ainsi, 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 avez besoin de l’ancien comportement, vous pouvez utiliser Qt.resolvedUrl
Par exemple, si vous avez un code tel que
property url imageFolder: "./images"vous pouvez le réécrire comme suit
property url imageFolder: Qt.resolvedUrl("./images")Qt.resolvedUrl peut être utilisé aussi bien dans Qt 5 que dans Qt 6.
Pour faciliter le portage, la variable d’environnement ` QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT ` peut être définie sur 1 afin de reproduire le comportement de Qt 5. Cette option est disponible depuis Qt 6.2.2. Il est toutefois recommandé de ne l’utiliser que pour débloquer un portage et d’utiliser ` Qt.resolvedUrl ` comme expliqué ci-dessus.
Propriétés de variante
variant Les propriétés de type « variant », marquées comme obsolètes depuis Qt 5, sont désormais traitées exactement de la même manière que les propriétés de type « var ». Le code qui s’appuyait sur une conversion implicite de chaîne déclenchée lors de l’affectation à des propriétés de type « variant » doit être mis à jour afin de créer explicitement un objet du type correct.
Par exemple, si vous avez un code tel que
property variant myColor: "red"vous pouvez le réécrire ainsi
property variant myColor: Qt.color("red")Des conversions implicites étaient effectuées pour les chaînes pouvant être analysées comme
- couleur (utilisez plutôt Qt.color),
- date (utilisez plutôt l’objet Date),
- rect (utilisez Qt.rect à la place) et
- size (utilisez Qt.size à la place)
variant reste un mot-clé obsolète dans Qt 6, bien qu’il soit fortement recommandé, dans le nouveau code, d’utiliser plutôt des propriétés de type « var ».
Remarque : si vous savez que le type de la propriété ne changera pas, utilisez une propriété de type concret plutôt qu'une propriété var.
Remarque : ces conversions ont également été appliquées aux propriétés « QVariant » des classes enregistrées auprès du moteur. Comme pour les propriétés « variant », le code qui reposait sur des conversions implicites de chaînes de caractères doit désormais utiliser les fonctions correspondantes de l’objet Qt.
Modifications de l'API entraînant une incompatibilité avec le code source
API modifiée
QQmlListPropertyLes propriétés ` CountFunction ` et ` AtFunction ` ont été modifiées pour utiliser ` qsizetype ` au lieu de ` int `, afin de s’aligner sur les modifications correspondantes apportées aux conteneurs Qt.
Par exemple, si vous avez un code tel que
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 devant prendre en charge à la fois Qt 5 et Qt 6 peut soit utiliser un typedef, à savoir int dans Qt 5 et qsizetype dans Qt 6, soit utiliser QList::size_type, qui est déjà un alias de type.
API supprimées
Diverses 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 du type
QQmlListProperty<QObject>(owner, owner->objectList);vous pouvez le réécrire ainsi :
QQmlListProperty<QObject>(owner, &owner->objectList); - Les fonctions
qmlDebug,qmlInfo,qmlWarning,qmlContextetqmlEngineexistaient auparavant à la fois dans l'espace de noms global (ou dans l'espace de noms Qt dans les versions avec espaces de noms) et dans l'espace de nomsQtQml. Ces fonctions n'existent désormais plus que dans l'espace de noms global.Par exemple, si vous avez un code tel que
QQmlEngine *engine = QtQml::qmlEngine(qmlObject);vous pouvez le réécrire ainsi :
QQmlEngine *engine = qmlEngine(qmlObject); - La surcharge de `
qmlRegisterType` ne prenant aucun argument a été supprimée. Utilisez plutôt `qmlRegisterAnonymousType`, ou passez à l'enregistrement déclaratif des types avec `QML_ANONYMOUS`.Par exemple, si vous avez un code tel que
class AnonymousType : public QObject { // ... }; qmlRegisterType<AnonymousType>();vous pouvez le réécrire comme suit :
class AnonymousType : public QObject { // ... }; qmlRegisterAnonymousType<AnonymousType>("MyModule", 1);Ou bien
class AnonymousType : public QObject { QML_ANONYMOUS // ... }; - Les surcharges de `
qmlRegisterExtendedType` et `qmlRegisterInterface` qui ne prennent aucun argument de version ont été supprimées. Utilisez les surcharges fournissant une version, ou passez à l'enregistrement déclaratif des types avec ` QML_EXTENDED ` et ` QML_INTERFACE`.Par exemple, si vous avez un code tel que
struct GreetInterface { virtual ~GreetInterface(); virtual void greet(); }; Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface") qmlRegisterInterface<GreetInterface>("Greeter");vous pouvez le réécrire comme suit :
struct GreetInterface { virtual ~GreetInterface(); virtual void greet(); }; Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface") qmlRegisterInterface<GreetInterface>("Greeter", 1);Sinon,
struct GreetInterface { QML_INTERFACE(Greeter) virtual ~GreetInterface(); virtual void greet(); }; Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface")Remarque : dans le nouveau code, il est préférable d’utiliser l’enregistrement déclaratif des types.
- La fonction
QJSValue::enginea été supprimée. Si l'accès au moteur est nécessaire, il faut plutôt stocker une référence à celui-ci. qmlAttachedPropertiesObjectByIdetqmlAttachedPropertiesObject(int *, const QObject *, const QMetaObject *, bool)ont été supprimées. Utilisez plutôt la surchargeqmlAttachedPropertiesObject(QObject *, QQmlAttachedPropertiesFunc, bool)deqmlAttachedPropertiesObject.QJSEngine::installTranslatorFunctionsa été supprimée.QJSEngine::installExtensionsest disponible en remplacement.Par exemple, si vous avez un code tel que
QJSEngine engine; engine.installTranslatorFunctions();vous pouvez le réécrire comme suit :
Voir aussi «Modernisation des modules QML » et « Portage des 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.