TreeModel QML Type
Encapsula un modelo de árbol simple. Más...
| Import Statement: | import Qt.labs.qmlmodels |
| Since: | Qt 6.10 |
Propiedades
- columnCount : int
- rows : var
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.
|
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.