Auf dieser Seite

TreeModel QML Type

Kapselt ein einfaches Baummodell. Mehr...

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

Eigenschaften

Methoden

  • 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)

Detaillierte Beschreibung

Der Typ TreeModel speichert JavaScript/JSON-Objekte als Daten für ein Baummodell, das mit TreeView verwendet werden kann. Er soll sehr einfache Modelle unterstützen, ohne dass eine eigene QAbstractItemModel Unterklasse in C++ erstellt werden muss.

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 {}
    }
}

Die Anfangsdaten des Modells werden entweder mit der Eigenschaft rows oder durch den Aufruf von appendRow() festgelegt. Jede Spalte im Modell wird durch die Deklaration einer TableModelColumn Instanz spezifiziert, wobei die Reihenfolge jeder Instanz ihren Spaltenindex bestimmt. Sobald das Signal Component::completed() des Modells ausgegeben wurde, sind die Spalten und Rollen festgelegt und gelten für die gesamte Lebensdauer des Modells.

Unterstützte Zeilen-Datenstrukturen

Jede Zeile stellt einen Knoten im Baum dar. Jeder Knoten hat den gleichen Typ von Spalten. Das TreeModel ist so konzipiert, dass es mit JavaScript/JSON-Daten arbeitet, so dass jede Zeile eine Liste von einfachen Schlüssel-Wert-Paaren ist:

                {
                    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",
                        }]
                }

Ein Knoten kann untergeordnete Knoten haben und diese werden in einem Array gespeichert, das mit dem Schlüssel "rows" verbunden ist. "rows" ist für diesen Zweck reserviert: nur die Liste der Kindknoten sollte mit diesem Schlüssel verknüpft werden.

Das Modell wird über QModelIndices manipuliert. Um auf eine bestimmte Zeile/einen bestimmten Knoten zuzugreifen, kann die Funktion getRow() verwendet werden. Es ist auch möglich, über die Eigenschaft rows direkt auf die JavaScript-Daten des Modells zuzugreifen, aber es ist nicht möglich, die Modelldaten auf diese Weise zu ändern.

Um neue Zeilen hinzuzufügen, verwenden Sie appendRow(). Um bestehende Zeilen zu ändern, verwenden Sie setRow(), removeRow() und clear().

Verwendung des TreeModel mit externen JSON-Quellen

Obwohl die beabsichtigte Verwendung des TreeModel darin besteht, die JSON-Daten an Ort und Stelle in der QML-Datei zu definieren, können Sie jedes JSON-Objekt mit dem Model verwenden, solange seine Struktur mit der durch das TreeModel definierten Struktur übereinstimmt. Wenn alle Zeilen des JSON-Objekts mit den vom Model definierten Spalten übereinstimmen, können Sie es direkt über die Eigenschaft rows zuweisen.

Die Quelle des JSON-Objekts kann eine Datei sein. Wenn das Modell zum Beispiel definiert ist als

    TreeModel {
        id: treeModel
        objectName: "testModel"

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

und das JSON-Objekt in der Datei gespeichert ist und wie folgt aussieht

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"
            }
        ]
    }
]

dann kann dieses Objekt durch Importieren der JavaScript-Datei als

Modul

import "TreeData.js" as JsonData

importiert werden und kann dann direkt zugewiesen werden

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

Achtung! Stellen Sie sicher, dass die JSON-Daten aus einer vertrauenswürdigen Quelle stammen. Da das Modell seine Zeilen dinamisch auf der Grundlage der Eingabe auffüllt, kann fehlerhaftes oder nicht vertrauenswürdiges JSON zu unerwartetem Verhalten oder Leistungsproblemen führen.

Unter TableModel finden Sie ein weiteres Beispiel, in dem ein JSON-Objekt geparst und als JavaScript-Array zugewiesen wird.

Siehe auch TableModelColumn und TreeView.

Dokumentation der Eigenschaften

columnCount : int [read-only]

Diese schreibgeschützte Eigenschaft enthält die Anzahl der Spalten des Modells.

Die Anzahl der Spalten ist für die Lebensdauer des Modells festgelegt, nachdem die Eigenschaft rows festgelegt oder appendRow() zum ersten Mal aufgerufen wurde.

rows : var

Diese Eigenschaft enthält die Modelldaten in Form eines Arrays von Zeilen.

Siehe auch getRow(), setRow(), appendRow(), clear(), und columnCount.

Dokumentation der Methode

void appendRow(var treeRow)

Hängt treeRow an den Wurzelknoten an.

Siehe auch setRow() und removeRow().

void appendRow(parent, var treeRow)

Hängt eine neue treeRow an parent an, mit den Werten (Zellen) in 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 ist ein anonymer QML-Typ, der von QModelIndex unterstützt wird. Wenn parent ungültig ist, wird treeRow an den Wurzelknoten angehängt.

Siehe auch setRow() und removeRow().

void clear()

Entfernt alle Zeilen aus dem Modell.

Siehe auch removeRow().

variant data(index, string role)

Gibt die Daten von TreeModel an der angegebenen index zurück, die zu der angegebenen role gehören.

index ist ein anonymer QML-Typ, der von QModelIndex unterstützt wird.

Siehe auch index() und setData().

var getRow(rowIndex)

Gibt die treeRow am angegebenen Index im Modell zurück. rowIndex ist ein anonymer QML-Typ, der von QModelIndex unterstützt wird.

Hinweis: Das zurückgegebene Objekt kann nicht verwendet werden, um den Inhalt des Modells zu ändern; verwenden Sie stattdessen setTreeRow().

Siehe auch setRow(), appendRow(), und removeRow().

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

Gibt ein Objekt zurück, das auf die angegebenen treeIndex und column verweist. Dieses Objekt kann an die Funktion data() übergeben werden, um die Daten aus dieser Zelle zu erhalten, oder an setData(), um den Inhalt dieser Zelle zu bearbeiten.

Das zurückgegebene Objekt ist ein anonymer QML-Typ, der durch QModelIndex unterstützt wird.

Der erste Parameter treeIndex stellt einen Pfad von Zeilennummern dar, der von der Wurzel bis zur gewünschten Zeile führt und für die Navigation innerhalb des Baums verwendet wird. Dies lässt sich am besten anhand eines Beispiels erklären.

Baumdiagramm mit den Knoten A bis F mit Indexpfaden
  • Die Wurzel des Baums ist eine Besonderheit, da sie durch einen ungültigen QModelIndex referenziert werden kann.
  • Der Knoten A ist das erste Kind der Wurzel und die entsprechende treeIndex ist [0].
  • Knoten B ist das erste Kind von Knoten A. Da treeIndex von A [0] ist, wird treeIndex von B [0,0] sein.
  • Der Knoten C ist das zweite Kind von A und sein treeIndex ist [0,1].
  • Der Knoten D ist das dritte Kind von A und sein treeIndex ist [0,2].
  • Der Knoten E ist das zweite Kind der Wurzel und sein treeIndex ist [1].
  • Der Knoten F ist das dritte Kind der Wurzel und sein treeIndex ist [2].

Mit dieser Überladung ist es möglich, eine QModelIndex zu einem Knoten zu erhalten, ohne eine QModelIndex zu seinem Elternknoten zu haben.

Wenn kein Knoten durch die angegebene Liste gefunden wird, wird ein ungültiger Modellindex zurückgegeben. Bitte beachten Sie, dass ein ungültiger Modellindex die Wurzel des Knotens referenziert.

Siehe auch QModelIndex und verwandte Klassen in QML und data().

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

Gibt ein Objekt zurück, das auf die gegebenen row und column einer gegebenen parent verweist, das an die Funktion data() übergeben werden kann, um die Daten aus dieser Zelle zu erhalten, oder an setData(), um den Inhalt dieser Zelle zu bearbeiten.

Das zurückgegebene Objekt ist ein anonymer QML-Typ, der von QModelIndex unterstützt wird.

Siehe auch QModelIndex und verwandte Klassen in QML und data().

void removeRow(rowIndex)

Entfernt die von rowIndex referenzierte TreeRow aus dem Modell. rowIndex ist ein anonymer QML-Typ, der von QModelIndex unterstützt wird.

treeModel.removeTreeRow(rowIndex)

Siehe auch clear().

bool setData(index, variant value, string role)

Fügt das durch role benannte Datenfeld in der TreeRow an der angegebenen index mit value ein oder aktualisiert es. Gibt true zurück wenn erfolgreich, false wenn nicht.

index ist ein anonymer QML-Typ, der von QModelIndex unterstützt wird.

Siehe auch data() und index().

void setRow(rowIndex, var treeRow)

Ersetzt die TreeRow unter rowIndex im Model durch treeRow. rowIndex ist ein anonymer QML-Typ, der von QModelIndex unterstützt wird.

Eine Zeile mit untergeordneten Zeilen wird abgelehnt.

Alle Spalten/Zellen müssen in treeRow vorhanden sein, und zwar in der richtigen Reihenfolge. Die untergeordneten Zeilen der Zeile bleiben davon unberührt.

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

Siehe auch 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.