TreeModel QML Type
Encapsule un modèle d'arbre simple. Plus d'informations...
| Import Statement: | import Qt.labs.qmlmodels |
| Since: | Qt 6.10 |
Propriétés
- columnCount : int
- rows : var
Méthodes
- 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)
Description détaillée
Le type TreeModel stocke des objets JavaScript/JSON en tant que données pour un modèle d'arbre qui peut être utilisé avec TreeView. Il est destiné à prendre en charge des modèles très simples sans nécessiter la création d'une sous-classe personnalisée de 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 {} } }
Les données initiales du modèle sont définies à l'aide de la propriété rows ou en appelant appendRow(). Chaque colonne du modèle est spécifiée en déclarant une instance de TableModelColumn, où l'ordre de chaque instance détermine l'index de la colonne. Une fois que le signal Component::completed() du modèle a été émis, les colonnes et les rôles ont été établis et sont fixés pour toute la durée de vie du modèle.
Structures de données de ligne prises en charge
Chaque ligne représente un nœud dans l'arbre. Chaque nœud possède le même type de colonnes. Le TreeModel est conçu pour fonctionner avec des données JavaScript/JSON, de sorte que chaque ligne est une liste de simples paires clé-valeur :
{
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 nœud peut avoir des nœuds enfants qui seront stockés dans un tableau associé à la clé "rows". La clé "rows" est réservée à cet effet : seule la liste des nœuds enfants doit être associée à cette clé.
Le modèle est manipulé via QModelIndices. Pour accéder à une ligne/nœud spécifique, la fonction getRow() peut être utilisée. Il est également possible d'accéder directement aux données JavaScript du modèle via la propriété rows, mais il n'est pas possible de modifier les données du modèle de cette manière.
Pour ajouter de nouvelles lignes, utilisez appendRow(). Pour modifier des lignes existantes, utilisez setRow(), removeRow() et clear().
Utilisation du TreeModel avec des sources JSON externes
Bien que l'utilisation prévue du TreeModel soit de définir les données JSON en place dans le fichier QML, vous pouvez utiliser n'importe quel objet JSON avec le modèle tant que sa structure correspond à la structure définie par le TreeModel. Si toutes les lignes de l'objet JSON sont conformes aux colonnes définies par le modèle, vous pouvez les assigner directement via la propriété rows.
La source de l'objet JSON peut être un fichier. Par exemple, si le modèle est défini comme
TreeModel { id: treeModel objectName: "testModel" TableModelColumn { display: "checked" } TableModelColumn { display: "size" } TableModelColumn { display: "type" } TableModelColumn { display: "name" } TableModelColumn { display: "lastModified" } }
et que l'objet JSON stocké dans le fichier ressemble à
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"
}
]
}
]cet objet peut être fourni en important le fichier JavaScript en tant que
module
import "TreeData.js" as JsonData
et il peut ensuite être assigné directement
Component.onCompleted: treeView.model.rows = JsonData.folders
Attention : Assurez-vous que les données JSON proviennent d'une source fiable. Étant donné que le modèle remplit ses lignes de manière dynamique en fonction des données saisies, des données JSON mal formées ou non fiables peuvent entraîner un comportement inattendu ou des problèmes de performance.
Voir TableModel pour un autre exemple où un objet JSON est analysé et assigné en tant que tableau JavaScript.
Voir également TableModelColumn et TreeView.
Documentation sur les propriétés
columnCount : int [read-only]
Cette propriété en lecture seule contient le nombre de colonnes dans le modèle.
Le nombre de colonnes est fixé pour la durée de vie du modèle après que la propriété rows a été définie ou que appendRow() a été appelé pour la première fois.
rows : var
Cette propriété contient les données du modèle sous la forme d'un tableau de lignes.
Voir aussi getRow(), setRow(), appendRow(), clear() et columnCount.
Documentation de la méthode
void appendRow(var treeRow)
Ajoute treeRow au nœud racine.
Voir aussi setRow() et removeRow().
void appendRow(parent, var treeRow)
Ajoute un nouveau treeRow à parent, avec les valeurs (cellules) dans 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 est un type QML anonyme soutenu par QModelIndex. Si parent est invalide, treeRow est ajouté au nœud racine.
Voir aussi setRow() et removeRow().
void clear()
Supprime toutes les lignes du modèle.
Voir également removeRow().
variant data(index, string role)
Renvoie les données de l'adresse TreeModel à l'adresse index donnée appartenant à l'adresse role donnée.
index est un type QML anonyme soutenu par QModelIndex.
Voir aussi index() et setData().
var getRow(rowIndex)
Renvoie le treeRow à l'index spécifié dans le modèle. rowIndex est un type QML anonyme soutenu par QModelIndex.
Remarque : l'objet retourné ne peut pas être utilisé pour modifier le contenu du modèle ; utilisez plutôt setTreeRow().
Voir aussi setRow(), appendRow(), et removeRow().
QModelIndex index(list<int> treeIndex, int column)
Renvoie un objet faisant référence à treeIndex et column, qui peut être transmis à la fonction data() pour obtenir les données de cette cellule, ou à setData() pour modifier le contenu de cette cellule.
L'objet renvoyé est un type QML anonyme soutenu par QModelIndex.
Le premier paramètre treeIndex représente un chemin de numéros de ligne allant de la racine à la ligne souhaitée et est utilisé pour la navigation à l'intérieur de l'arbre. La meilleure façon de l'expliquer est de le faire à l'aide d'un exemple.
|
Avec cette surcharge, il est possible d'obtenir un QModelIndex pour un nœud sans avoir un QModelIndex pour son nœud parent.
Si aucun nœud n'est trouvé par la liste spécifiée, un index de modèle non valide est renvoyé. Veuillez noter qu'un index de modèle non valide fait référence à la racine du nœud.
Voir aussi QModelIndex et les classes associées dans QML et data().
QModelIndex index(int row, int column, var parent)
Renvoie un objet faisant référence à row et column d'un parent donné, qui peut être transmis à la fonction data() pour obtenir les données de cette cellule, ou à setData() pour modifier le contenu de cette cellule.
L'objet renvoyé est un type QML anonyme soutenu par QModelIndex.
Voir aussi QModelIndex et les classes apparentées en QML et data().
void removeRow(rowIndex)
Supprime du modèle le TreeRow référencé par rowIndex. rowIndex est un type QML anonyme soutenu par QModelIndex.
treeModel.removeTreeRow(rowIndex)Voir également clear().
bool setData(index, variant value, string role)
Insère ou met à jour le champ de données désigné par role dans le TreeRow à l'adresse index avec value. Retourne true en cas de succès, false en cas d'échec.
index est un type QML anonyme soutenu par QModelIndex.
void setRow(rowIndex, var treeRow)
Remplace le TreeRow à rowIndex dans le modèle par treeRow. rowIndex est un type QML anonyme soutenu par QModelIndex.
Une ligne avec des lignes enfants sera rejetée.
Toutes les colonnes/cellules doivent être présentes dans treeRow, et dans le bon ordre. Les lignes enfants de la ligne ne sont pas affectées.
treeModel.setRow(rowIndex, { checked: true, size: "-", type: "folder", name: "Subtitles", lastModified: "2025-07-07", iconColor: "blue" });
Voir aussi 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.