Auf dieser Seite

TreeModel QML Type

Kapseln 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 insertRow(int rowIndex, object row) (since 6.12)
  • void insertRow(int rowIndex, QModelIndex parent, object row) (since 6.12)
  • bool moveRows(QModelIndex sourceParent, int sourceRow, int count, QModelIndex destinationParent, int destinationChild) (since 6.12)
  • void removeRow(rowIndex)
  • bool setData(index, variant value, string role)
  • void setRow(rowIndex, var treeRow)

Ausführliche Beschreibung

Der Typ `TreeModel` speichert JavaScript-/JSON-Objekte als Daten für ein Baummodell, das mit ` TreeView` verwendet werden kann. Er ist dafür vorgesehen, sehr einfache Modelle zu unterstützen, ohne dass die Erstellung einer benutzerdefinierten Unterklasse von ` QAbstractItemModel ` in C++ erforderlich ist.

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 über die Eigenschaft „ rows “ oder durch den Aufruf von „ appendRow()“ festgelegt. Jede Spalte im Modell wird durch die Deklaration einer „ TableModelColumn “-Instanz festgelegt, wobei die Reihenfolge der einzelnen Instanzen den Spaltenindex bestimmt. Sobald das Signal „ Component::completed()“ des Modells ausgelöst wurde, sind die Spalten und Rollen festgelegt und bleiben für die gesamte Lebensdauer des Modells unverändert.

Unterstützte Zeilendatenstrukturen

Jede Zeile repräsentiert einen Knoten im Baum. Jeder Knoten hat denselben Spaltentyp. Das `TreeModel` ist für die Verwendung mit JavaScript-/JSON-Daten ausgelegt, sodass jede Zeile eine Liste einfacher Schlüssel-Wert-Paare 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, die in einem Array gespeichert werden, das dem Schlüssel „rows“ zugeordnet ist. „rows“ ist für diesen Zweck reserviert: Nur die Liste der untergeordneten Knoten sollte diesem Schlüssel zugeordnet sein.

Die Bearbeitung des Modells erfolgt über ` QModelIndices`. Um auf eine bestimmte Zeile/einen bestimmten Knoten zuzugreifen, kann die Funktion ` getRow()` verwendet werden. Es ist auch möglich, direkt über die Eigenschaft ` rows ` auf die JavaScript-Daten des Modells zuzugreifen, allerdings lassen sich die Modelldaten auf diese Weise nicht ändern.

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

Verwendung des TreeModel mit externen JSON-Quellen

Obwohl das TreeModel dafür vorgesehen ist, die JSON-Daten direkt in der QML-Datei zu definieren, können Sie jedes beliebige JSON-Objekt mit dem Modell verwenden, solange dessen Struktur mit der vom TreeModel definierten Struktur übereinstimmt. Wenn alle Zeilen des JSON-Objekts den vom Modell definierten Spalten entsprechen, können Sie es direkt über die Eigenschaft `rows` zuweisen.

Die Quelle des JSON-Objekts kann eine Datei sein. Wenn das Modell beispielsweise wie folgt definiert ist

    TreeModel {
        id: treeModel
        objectName: "testModel"

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

und das in der Datei gespeicherte JSON-Objekt 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 bereitgestellt werden, indem die JavaScript-Datei als

Modul

import "TreeData.js" as JsonData

und anschließend direkt zugewiesen werden

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

Warnung: Stellen Sie sicher , dass die JSON-Daten aus einer vertrauenswürdigen Quelle stammen. Da das Modell seine Zeilen dynamisch auf der Grundlage der Eingabe füllt, können fehlerhafte oder nicht vertrauenswürdige JSON-Daten zu unerwartetem Verhalten oder Leistungsproblemen führen.

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

Siehe auch TableModelColumn und TreeView.

Dokumentation zu Eigenschaften

columnCount : int [read-only]

Diese schreibgeschützte Eigenschaft gibt die Anzahl der Spalten im Modell an.

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

rows : var

Diese Eigenschaft enthält die Modeldaten in Form eines Zeilen-Arrays.

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

Methodendokumentation

void appendRow(var treeRow)

Fügt „ treeRow “ zum Stammknoten hinzu.

Siehe auch „ setRow()“ und „ removeRow()“.

void appendRow(parent, var treeRow)

Fügt eine neue `treeRow` zu ` parent` hinzu, mit den Werten (Zellen) aus ` 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 auf „ QModelIndex “ basiert. Ist „ parent “ ungültig, 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 aus dem „ TreeModel “ an der angegebenen Adresse „ index “ zurück, die zum angegebenen „ role “ gehört.

index ist ein anonymer QML-Typ, der auf „ QModelIndex “ basiert.

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 auf „ QModelIndex “ basiert.

Hinweis: Das zurückgegebene Objekt kann nicht zum Ändern des Inhalts des Modells verwendet werden; 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 Werte ` treeIndex ` und ` column` verweist. Dieses Objekt kann an die Funktion ` data()` übergeben werden, um die Daten dieser Zelle abzurufen, oder an ` setData()`, um den Inhalt dieser Zelle zu bearbeiten.

Das zurückgegebene Objekt ist ein anonymer QML-Typ, der auf QModelIndex basiert.

Der erste Parameter ` treeIndex ` stellt einen Pfad aus Zeilennummern dar, der von der Wurzel bis zur gewünschten Zeile verläuft, und dient zur Navigation innerhalb des Baums. Dies lässt sich am besten anhand eines Beispiels verdeutlichen.

Baumdiagramm mit den Knoten A bis F und den Indexpfaden
  • Die Wurzel des Baums ist ein Sonderfall, da sie durch einen ungültigen ` QModelIndex` referenziert werden kann.
  • Knoten A ist das erste Kind des Stamms, und der entsprechende ` treeIndex ` lautet ` [0]`.
  • Knoten B ist der erste Nachkomme von Knoten A. Da die treeIndex von A [0] lautet, lautet die treeIndex von B [0,0].
  • Knoten C ist der zweite Nachkomme von A und sein treeIndex lautet [0,1].
  • Knoten D ist der dritte Nachkomme von A und seine treeIndex lautet [0,2].
  • Knoten E ist das zweite Kind der Wurzel und seine treeIndex lautet [1].
  • Knoten F ist das dritte Kind des Wurzelknotens und seine „ treeIndex “ lautet [2].

Mit dieser Überladung ist es möglich, einen „ QModelIndex “ zu einem Knoten zu erhalten, ohne über einen „ QModelIndex “ zu dessen übergeordneten Knoten zu verfügen.

Wird anhand der angegebenen Liste kein Knoten gefunden, wird ein ungültiger Modellindex zurückgegeben. Bitte beachten Sie, dass ein ungültiger Modellindex auf die Wurzel des Knotens verweist.

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

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

Gibt ein Objekt zurück, das auf die angegebenen Eigenschaften „ row “ und „ column “ einer bestimmten Zelle „ parent “ verweist. Dieses Objekt kann an die Funktion „ data()“ übergeben werden, um die Daten dieser Zelle abzurufen, oder an „ setData()“, um den Inhalt dieser Zelle zu bearbeiten.

Das zurückgegebene Objekt ist ein anonymer QML-Typ, der auf „ QModelIndex “ basiert.

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

[since 6.12] void insertRow(int rowIndex, object row)

Fügt am Stammelement an der Position rowIndex eine neue Zeile ein, deren Werte (Zellen) in row enthalten sind.

Diese Methode wurde in Qt 6.12 eingeführt.

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

[since 6.12] void insertRow(int rowIndex, QModelIndex parent, object row)

Fügt eine neue Zeile an der Position rowIndex in die Datei „ parent “ ein, mit den Werten (Zellen) aus row.

model.insertRow(2, parentIndex, {
    checkable: true, checked: false,
    amount: 1,
    fruitType: "Pear",
    fruitName: "Williams",
    fruitPrice: 1.50,
})

Diese Methode wurde in Qt 6.12 eingeführt.

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

[since 6.12] bool moveRows(QModelIndex sourceParent, int sourceRow, int count, QModelIndex destinationParent, int destinationChild)

Verschiebt die Zeilen „ count “ beginnend bei „ sourceRow “ von „ sourceParent “ nach „ destinationParent “ und fügt sie vor „ destinationChild “ ein.

destinationChild bezieht sich auf die Position in destinationParent vor der Verschiebung (Index vor der Entfernung), entsprechend QAbstractItemModel::beginMoveRows().

Der Quell- und der Zielbereich müssen vorhanden sein, und sourceParent sowie destinationParent dürfen sich nicht so überlappen, dass ein übergeordnetes Element unter sein eigenes untergeordnetes Element verschoben würde.

Gibt „ true “ zurück, wenn die Zeilen erfolgreich verschoben wurden; andernfalls wird „ false “ zurückgegeben.

Diese Methode wurde in Qt 6.12 eingeführt.

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

void removeRow(rowIndex)

Entfernt die TreeRow, auf die rowIndex verweist, aus dem Modell. rowIndex ist ein anonymer QML-Typ, der auf QModelIndex basiert.

treeModel.removeTreeRow(rowIndex)

Siehe auch clear().

bool setData(index, variant value, string role)

Fügt das unter role genannte Datenfeld in die TreeRow an der angegebenen Position index mit den Werten value ein bzw. aktualisiert es. Gibt bei Erfolg „true“ zurück, andernfalls „false“.

index ist ein anonymer QML-Typ, der auf „ QModelIndex “ basiert.

Siehe auch „ data()“ und „ index()“.

void setRow(rowIndex, var treeRow)

Ersetzt die „TreeRow“ unter rowIndex im Modell 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.