Références aux types de valeurs et aux séquences QML
Lestypes de valeur QML et les types de séquence QML sont nécessairement transmis par une valeur. Contrairement aux types d'objets QML, ils n'ont pas d'identité propre, mais ne peuvent être accédés 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 objet. Le concept de type de valeur n'existe pas en JavaScript. Par exemple, si vous exécutez font.bold = true en JavaScript, nous nous attendons à ce que la propriété bold de font soit définie, quelle que soit la nature de font. Mais considérons l'extrait de code suivant :
import QtQuick Text { onSomethingHappened: font.bold = true }
Dans ce cas, nous savons que font est un type de valeur. En y accédant, nous créons une copie locale en appelant le getter d'un Q_PROPERTY. Nous pouvons ensuite définir la propriété bold, mais cela n'affecte généralement que la copie, et non l'original Q_PROPERTY.
Pour résoudre ce problème, QML propose le concept de références. Lorsque vous récupérez une instance d'une valeur ou d'un type de séquence à partir d'une propriété, le moteur QML se souvient de la propriété en même temps que de 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 avec une identité distincte et permet au cas ci-dessus, ainsi qu'à beaucoup d'autres, de fonctionner.
Cela peut toutefois s'avérer assez coûteux. Si une séquence est exposée en tant que Q_PROPERTY, l'accès à n'importe quelle valeur de la séquence par index entraînera la lecture de l'ensemble des données de la séquence à partir de la propriété. À partir de ces données de séquence, un seul élément est ensuite récupéré. De même, la modification d'une valeur quelconque 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éinscrite dans le bien. 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 Q_INVOKABLE, vous évitez ce surcoût. Les valeurs de retour ne sont attachées à aucune propriété et ne seront pas réécrites.
Les séquences de types d'objets sont transmises par défaut sous la forme de QQmlListProperty. QQmlListProperty n'est pas un conteneur réel, mais seulement une vue ou une référence à un stockage séquentiel. Par conséquent, QQmlListProperty n'est pas affecté par cet effet. Vous pouvez cependant enregistrer d'autres types de séquences pour les objets en utilisant QML_SEQUENTIAL_CONTAINER. Ceux-ci seront affecté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.