qt delegates qml qtquick2 qqmlcomponent

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.