Sur cette page

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

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.

Diagramme arborescent montrant les nœuds A à F avec les chemins d'indexation
  • La racine de l'arbre est particulière, car elle peut être référencée par un QModelIndex invalide.
  • Le nœud A est le premier enfant de la racine et le treeIndex correspondant est [0].
  • Le nœud B est le premier enfant du nœud A. Comme le treeIndex de A est [0], le treeIndex de B sera [0,0].
  • Le nœud C est le deuxième enfant de A et son treeIndex est [0,1].
  • Le nœud D est le troisième enfant de A et son treeIndex est [0,2].
  • Le nœud E est le deuxième enfant de la racine et son treeIndex est [1].
  • Le nœud F est le troisième enfant de la racine et son treeIndex est [2].

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.

Voir aussi data() et index().

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.