TreeModel QML Type
Kapselt ein einfaches Baummodell. Mehr...
| Import Statement: | import Qt.labs.qmlmodels |
| Since: | Qt 6.10 |
Eigenschaften
- columnCount : int
- rows : var
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.
|
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.