Références aux types de valeur et aux types de séquence QML

Les types de valeur et les types de séquence QML sont nécessairement passés par valeur. Contrairement aux types d'objet QML, ils n'ont pas d'identité propre, mais ne sont accessibles qu'en tant que propriétés d'autres objets ou valeurs, ou en tant que valeurs renvoyées par des méthodes. Chaque accès de ce type crée implicitement une copie. Or, en JavaScript, tout est un objet. Le concept de « type de valeur » n’existe pas en JavaScript. Par exemple, si vous exécutez ` font.bold = true ` en JavaScript, on s’attend à ce que la propriété ` bold ` de ` font ` soit définie, quelle que soit la valeur de ` font `. Mais considérez l’extrait de code suivant :

import QtQuick
Text {
    onSomethingHappened: font.bold = true
}

Dans ce cas, nous savons que ` font ` est un type de valeur. Y accéder crée une copie locale en appelant le getter de ` Q_PROPERTY`. Nous pouvons alors définir la propriété ` bold ` sur cette copie, mais cela n’affecterait généralement que la copie, et non l’original ` Q_PROPERTY`.

Pour remédier à ce problème, QML propose le concept de références. Lorsque vous récupérez une instance d’un type « valeur » ou « séquence » à partir d’une propriété, le moteur QML mémorise la propriété ainsi que la valeur elle-même. Si la valeur est modifiée, elle est réécrite dans la propriété. Cela donne l’illusion d’un objet doté d’une identité distincte et permet au cas ci-dessus, ainsi qu’à bien d’autres, de fonctionner correctement.

Cela peut toutefois s’avérer assez coûteux. Si une séquence est exposée sous la forme d’un ` Q_PROPERTY`, l’accès à n’importe quelle valeur de la séquence par index entraînera la lecture de l’intégralité des données de la séquence à partir de la propriété. À partir de ces données, un seul élément est alors récupéré. De même, la modification de n’importe quelle valeur de la séquence entraîne la lecture des données de la séquence. La modification est ensuite effectuée et la séquence modifiée est réécrite dans la propriété. Une opération de lecture peut être relativement peu coûteuse si le type en question est implicitement partagé. Une modification entraîne toujours au moins une copie profonde.

Si vous renvoyez une instance d’une séquence ou d’un type de valeur à partir d’une fonction de type « Q_INVOKABLE », vous évitez cette surcharge. Les valeurs renvoyées ne sont associées à aucune propriété et ne seront pas réécrites.

Les séquences de types d’objets sont transmises par défaut en tant qu’ QQmlListProperty. ` QQmlListProperty ` n’est pas un véritable conteneur, mais seulement une vue, ou une référence, vers un stockage séquentiel. Par conséquent, ` QQmlListProperty ` n’est pas concerné par cet effet. Vous pouvez toutefois enregistrer d’autres types de séquences pour les objets à l’aide de ` QML_SEQUENTIAL_CONTAINER`. Ceux-ci seront concernés.

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