En esta página

TreeModel QML Type

Encapsula un modelo de árbol simple. Más...

Import Statement: import Qt.labs.qmlmodels
Since: Qt 6.10

Propiedades

Métodos

  • void appendRow(var treeRow)
  • void appendRow(parent, var treeRow)
  • void clear()
  • variant data(index, string role)
  • var getRow(rowIndex)
  • QModelIndex index(list<int> treeIndex, int column)
  • QModelIndex index(int row, int column, var parent)
  • void removeRow(rowIndex)
  • bool setData(index, variant value, string role)
  • void setRow(rowIndex, var treeRow)

Descripción detallada

El tipo TreeModel almacena objetos JavaScript/JSON como datos para un modelo de árbol que se puede utilizar con TreeView. Está pensado para soportar modelos muy simples sin necesidad de crear una subclase personalizada QAbstractItemModel en C++.

import QtQuick
import QtQuick.Controls
import Qt.labs.qmlmodels

ApplicationWindow {
    visible: true
    width: 500
    height: 500

    TreeView {
        id: treeView
        anchors.fill: parent

        selectionModel: ItemSelectionModel {}

        model: TreeModel {
            id: treeModel

            TableModelColumn {
                display: "checked"
            }
            TableModelColumn {
                display: "size"
            }
            TableModelColumn {
                display: "type"
            }
            TableModelColumn {
                display: "name"
            }
            TableModelColumn {
                display: "lastModified"
            }

            rows: [{
                    checked: false,
                    size: "—",
                    type: "folder",
                    name: "Documents",
                    lastModified: "2025-07-01",
                    rows: [{
                            checked: true,
                            size: "24 KB",
                            type: "file",
                            name: "Resume.pdf",
                            lastModified: "2025-06-20",
                        }, {
                            checked: false,
                            size: "2 MB",
                            type: "folder",
                            name: "Reports",
                            lastModified: "2025-06-10",
                            rows: [{
                                    checked: true,
                                    size: "850 KB",
                                    type: "file",
                                    name: "Q2_Report.docx",
                                    lastModified: "2025-06-15",
                                }, {
                                    checked: false,
                                    size: "1.2 MB",
                                    type: "file",
                                    name: "Q3_Plan.xlsx",
                                    lastModified: "2025-06-18",
                                }]
                        }]
                },
                {
                    checked: false,
                    size: "—",
                    type: "folder",
                    name: "Pictures",
                    lastModified: "2025-05-30",
                    rows: [{
                            checked: true,
                            size: "3.5 MB",
                            type: "file",
                            name: "Vacation.jpg",
                            lastModified: "2025-05-15",
                        }, {
                            checked: false,
                            size: "2.1 MB",
                            type: "file",
                            name: "Family.png",
                            lastModified: "2025-05-20",
                        }]
                }
            ]
        }

        delegate: TreeViewDelegate {}
    }
}

Los datos iniciales del modelo se establecen con la propiedad rows o llamando a appendRow(). Cada columna del modelo se especifica declarando una instancia de TableModelColumn, donde el orden de cada instancia determina su índice de columna. Una vez emitida la señal Component::completed() del modelo, se habrán establecido las columnas y los roles, que quedarán fijados para toda la vida del modelo.

Estructuras de datos de filas admitidas

Cada fila representa un nodo del árbol. Cada nodo tiene el mismo tipo de columnas. El TreeModel está diseñado para trabajar con datos JavaScript/JSON, por lo que cada fila es una lista de simples pares clave-valor:

                {
                    checked: false,
                    size: "—",
                    type: "folder",
                    name: "Pictures",
                    lastModified: "2025-05-30",
                    rows: [{
                            checked: true,
                            size: "3.5 MB",
                            type: "file",
                            name: "Vacation.jpg",
                            lastModified: "2025-05-15",
                        }, {
                            checked: false,
                            size: "2.1 MB",
                            type: "file",
                            name: "Family.png",
                            lastModified: "2025-05-20",
                        }]
                }

Un nodo puede tener nodos hijos y éstos se almacenarán en un array asociado a la clave "rows". "rows" está reservada para este propósito: sólo la lista de nodos hijos debe estar asociada a esta clave.

El modelo se manipula a través de QModelIndices. Para acceder a una fila/nodo concreto, se puede utilizar la función getRow(). También es posible acceder directamente a los datos JavaScript del modelo a través de la propiedad rows, pero no es posible modificar los datos del modelo de esta forma.

Para añadir nuevas filas, utilice appendRow(). Para modificar filas existentes, utilice setRow(), removeRow() y clear().

Uso de TreeModel con fuentes JSON externas

Aunque el uso previsto del TreeModel es definir los datos JSON in situ en el archivo QML, puede utilizar cualquier objeto JSON con el modelo siempre que su estructura coincida con la estructura definida por el TreeModel. Si todas las filas del objeto JSON se ajustan a las columnas definidas por el modelo, puede asignarlo directamente a través de la propiedad rows.

El origen del objeto JSON puede ser un fichero. Por ejemplo, si el modelo se define como

    TreeModel {
        id: treeModel
        objectName: "testModel"

        TableModelColumn { display: "checked" }
        TableModelColumn { display: "size" }
        TableModelColumn { display: "type" }
        TableModelColumn { display: "name" }
        TableModelColumn { display: "lastModified" }
    }

y el objeto JSON se almacena en el fichero y tiene el aspecto de

let folders = [
    {
        "checked": false,
        "size": "—",
        "type": "folder",
        "name": "Documents",
        "lastModified": "2025-07-01",
        "rows": [
            {
                "checked": true,
                "size": "24 KB",
                "type": "file",
                "name": "Resume.pdf",
                "lastModified": "2025-06-20"
            }
        ]
    },
    {
        "checked": false,
        "size": "—",
        "type": "folder",
        "name": "Pictures",
        "lastModified": "2025-05-30",
        "rows": [
            {
                "checked": true,
                "size": "3.5 MB",
                "type": "file",
                "name": "Vacation.jpg",
                "lastModified": "2025-05-15"
            }
        ]
    }
]

entonces este objeto se puede proporcionar importando el archivo JavaScript como un

módulo

import "TreeData.js" as JsonData

y luego se puede asignar directamente

    Component.onCompleted: treeView.model.rows = JsonData.folders

Advertencia: Asegúrese de que los datos JSON provienen de una fuente de confianza. Dado que el modelo rellena dinámicamente sus filas basándose en la entrada, un JSON malformado o no fiable puede provocar comportamientos inesperados o problemas de rendimiento.

Consulte TableModel para ver otro ejemplo en el que un objeto JSON se analiza y se asigna como una matriz JavaScript.

Véase también TableModelColumn y TreeView.

Documentación de propiedades

columnCount : int [read-only]

Esta propiedad de sólo lectura contiene el número de columnas del modelo.

El número de columnas es fijo durante toda la vida del modelo después de que se establezca la propiedad rows o se llame a appendRow() por primera vez.

rows : var

Esta propiedad contiene los datos del modelo en forma de matriz de filas.

Véase también getRow(), setRow(), appendRow(), clear(), y columnCount.

Documentación del método

void appendRow(var treeRow)

Añade treeRow al nodo raíz.

Véase también setRow() y removeRow().

void appendRow(parent, var treeRow)

Añade una nueva treeRow a parent, con los valores (celdas) en treeRow.

treeModel.appendRow(index, {
    checked: false,
    size: "-",
    type: "folder",
    name: "Orders",
    lastModified: "2025-07-02",
    rows: [
        {
            checked: true,
            size: "38 KB",
            type: "file",
            name: "monitors.xlsx",
            lastModified: "2025-07-02"
        },
        {
            checked: true,
            size: "54 KB",
            type: "file",
            name: "notebooks.xlsx",
            lastModified: "2025-07-02"
        }
    ]
});

parent es un tipo QML anónimo respaldado por QModelIndex. Si parent no es válido, treeRow se añade al nodo raíz.

Véase también setRow() y removeRow().

void clear()

Elimina todas las filas del modelo.

Véase también removeRow().

variant data(index, string role)

Devuelve los datos del TreeModel en el index dado perteneciente al role dado .

index es un tipo QML anónimo respaldado por QModelIndex.

Véase también index() y setData().

var getRow(rowIndex)

Devuelve el treeRow en el índice especificado en el modelo. rowIndex es un tipo QML anónimo respaldado por QModelIndex.

Nota: el objeto devuelto no puede utilizarse para modificar el contenido del modelo; utilice setTreeRow() en su lugar.

Véase también setRow(), appendRow() y removeRow().

QModelIndex index(list<int> treeIndex, int column)

Devuelve un objeto que hace referencia a treeIndex y column, que puede pasarse a la función data() para obtener los datos de esa celda, o a setData() para editar el contenido de esa celda.

El objeto devuelto es de tipo QML anónimo respaldado por QModelIndex.

El primer parámetro treeIndex representa una ruta de números de fila que va desde la raíz hasta la fila deseada y se utiliza para navegar dentro del árbol. Esto se explica mejor con un ejemplo.

Diagrama de árbol que muestra los nodos A a F con rutas índice
  • La raíz del árbol es especial, ya que puede ser referenciada por un QModelIndex no válido.
  • El nodo A es el primer hijo de la raíz y el treeIndex correspondiente es [0].
  • El nodo B es el primer hijo del nodo A. Dado que el treeIndex de A es [0], el treeIndex de B será [0,0].
  • El nodo C es el segundo hijo de A y su treeIndex es [0,1].
  • El nodo D es el tercer hijo de A y su treeIndex es [0,2].
  • El nodo E es el segundo hijo de la raíz y su treeIndex es [1].
  • El nodo F es el tercer hijo de la raíz y su treeIndex es [2].

Con esta sobrecarga es posible obtener un QModelIndex para un nodo sin tener un QModelIndex para su nodo padre.

Si no se encuentra ningún nodo en la lista especificada, se devuelve un índice de modelo no válido. Tenga en cuenta que un índice de modelo inválido hace referencia a la raíz del nodo.

Véase también QModelIndex y Clases relacionadas en QML y data().

QModelIndex index(int row, int column, var parent)

Devuelve un objeto que hace referencia a row y column de un parent dado que puede pasarse a la función data() para obtener los datos de esa celda, o a setData() para editar el contenido de esa celda.

El objeto devuelto es de tipo QML anónimo respaldado por QModelIndex.

Ver también QModelIndex y Clases relacionadas en QML y data().

void removeRow(rowIndex)

Elimina del modelo el TreeRow referenciado por rowIndex. rowIndex es un tipo QML anónimo respaldado por QModelIndex.

treeModel.removeTreeRow(rowIndex)

Véase también clear().

bool setData(index, variant value, string role)

Inserta o actualiza el campo de datos nombrado por role en el TreeRow en el index dado con value. Devuelve true si tiene éxito, false si no.

index es un tipo QML anónimo respaldado por QModelIndex.

Véase también data() y index().

void setRow(rowIndex, var treeRow)

Sustituye el TreeRow en rowIndex en el modelo con treeRow. rowIndex es un tipo QML anónimo respaldado por QModelIndex.

Una fila con filas hijas será rechazada.

Todas las columnas/celdas deben estar presentes en treeRow, y en el orden correcto. Las filas hijas de la fila no se verán afectadas.

treeModel.setRow(rowIndex, {
    checked: true,
    size: "-",
    type: "folder",
    name: "Subtitles",
    lastModified: "2025-07-07",
    iconColor: "blue"
});

Véase también appendRow().

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