qt - QML: Componente vs artículo como un contenedor
delegates qtquick2 (2)
La diferencia entre estos dos fragmentos es que el Rectangle
se mostrará inmediatamente. Esto está escrito en la documentation :
Tenga en cuenta que si bien un rectángulo por sí mismo se representaría y mostraría automáticamente, este no es el caso del rectángulo anterior porque está definido dentro de un componente. El componente encapsula los tipos QML dentro, como si estuvieran definidos en un archivo QML separado, y no se carga hasta que se solicite (en este caso, por los dos objetos del cargador). Debido a que el componente no se deriva del artículo, no puede anclar nada a él.
Al declarar delegados, se utiliza Component
porque hay varios elementos de delegado que se deben crear. Un solo Item
no funciona aquí. Puede pensar en Component
como una plantilla desde la cual puede crear objetos.
¿Cuál es la diferencia entre Component
y Item
en QML? La documentación no está del todo clara aquí. ¿Cuál es el tipo preferido para usar como contenedor para varios widgets? ¿Puede ser reemplazable por Rectangle
?
Por ejemplo, cuál es la diferencia en las siguientes declaraciones:
Item {
id: itemWidget
Rectangle { id: one }
Rectangle { id: two }
}
y
Component {
id: componentWidget
Rectangle { id: one }
Rectangle { id: two }
}
¿Por qué usualmente usamos Component
cuando declaramos un delegate
?
Un Component
es tanto un concepto como una cosa en QML. Un Item
es una cosa visual definida en el módulo QtQuick que se puede usar en QML. Estas dos cosas son conceptualmente diferentes.
Al igual que en el concepto QML, todas las cosas reutilizables se denominan componentes. Puede definir un componente de varias maneras, pero una manera fácil es crear un archivo .qml
y nombrarlo como nombre de su componente. Es decir: Button.qml o Switch.qml. Cuando el motor QML carga ese archivo, puede usarlo como botones o interruptores.
Otra forma de definir un componente es usar el Component {}
en un archivo qml. Esto le permite definir un nuevo componente en línea . Un componente definido en línea no funciona después de que un loader cargado explícitamente.
Un Item
, por otro lado, es un tipo simple definido en el módulo QtQuick.
Creo que está bien llamar a un Item
un Component
incluso aunque un Item
no se herede técnicamente de un Component
. O más precisamente, podría decir que su componente personalizado se basa en un Item
si su .qml
tiene un Item
como tipo de raíz.