Referencias a tipos de valor y secuencias QML
LosTipos deValor QML y los Tipos de Secuencia QML se transmiten necesariamente por valor. A diferencia de los tipos de objeto QML, no tienen identidad propia, sino que sólo se puede acceder a ellos como propiedades de otros objetos o valores, o como valores devueltos por métodos. Cada acceso de este tipo crea implícitamente una copia. Sin embargo, en JavaScript todo es un objeto. En JavaScript no existe el concepto de tipo de valor. Por ejemplo, si ejecutas font.bold = true en JavaScript, esperamos que la propiedad bold de font se establezca, sin importar qué es font. Pero considere el siguiente fragmento de código:
import QtQuick Text { onSomethingHappened: font.bold = true }
En este caso sabemos que font es un tipo de valor. Al acceder a él se crea una copia local llamando al getter de un Q_PROPERTY. Entonces podemos establecer la propiedad bold en él, pero eso normalmente sólo afectaría a la copia, no al Q_PROPERTY original.
Para superar este problema, QML ofrece el concepto de referencias. Cuando se recupera una instancia de un valor o tipo de secuencia a partir de una propiedad, el motor QML recuerda la propiedad junto con el propio valor. Si se modifica el valor, se vuelve a escribir en la propiedad. Esto produce la ilusión de un objeto con identidad separada y hace que el caso anterior, junto con muchos otros, simplemente funcione.
Sin embargo, esto puede ser bastante caro. Si una secuencia se expone como Q_PROPERTY, acceder a cualquier valor de la secuencia por índice hará que se lean todos los datos de la secuencia desde la propiedad. A partir de estos datos de secuencia, se recupera un único elemento. Del mismo modo, la modificación de cualquier valor de la secuencia provoca la lectura de los datos de la secuencia. A continuación, se realiza la modificación y la secuencia modificada se vuelve a escribir en la propiedad. Una operación de lectura puede ser relativamente barata si el tipo en cuestión está implícitamente compartido. Una modificación siempre incurre en al menos una copia profunda.
Si se devuelve una instancia de un tipo de secuencia o valor desde una función Q_INVOKABLE, se evita esta sobrecarga. Los valores devueltos no se adjuntan a ninguna propiedad y no se escribirán de vuelta.
Las secuencias de tipos de objeto se pasan como QQmlListProperty por defecto. QQmlListProperty no es un contenedor real, sino sólo una vista, o referencia, a algún almacenamiento secuencial. Por lo tanto, QQmlListProperty no se ve afectado por este efecto. Sin embargo, puede registrar otros tipos de secuencia para objetos utilizando QML_SEQUENTIAL_CONTAINER. Esos sí se verán afectados.
© 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.