TreeView QML Type
Bietet eine Baumansicht zur Anzeige von Daten aus einem QAbstractItemModel. Mehr...
Import Statement: | import QtQuick |
Since: | Qt 6.3 |
Inherits: |
Eigenschaften
- rootIndex : QModelIndex
(since 6.6)
Signale
Methoden
- collapse(row)
- collapseRecursively(row)
(since 6.4)
- int depth(row)
- expand(row)
- expandRecursively(row, depth)
(since 6.4)
- expandToIndex(QModelIndex index)
(since 6.4)
- bool isExpanded(row)
- toggleExpanded(row)
Detaillierte Beschreibung
Eine TreeView hat ein Modell, das die anzuzeigenden Daten definiert, und einen Delegaten, der definiert, wie die Daten angezeigt werden sollen.
TreeView erbt TableView. Das bedeutet, dass selbst wenn das Modell eine Eltern-Kind-Baumstruktur hat, TreeView intern ein Proxy-Modell verwendet, das diese Struktur in ein flaches Tabellenmodell umwandelt, das von TableView gerendert werden kann. Jeder Knoten im Baum belegt eine Zeile in der Tabelle, wobei die erste Spalte den Baum selbst wiedergibt. Durch die Einrückung jedes Delegatenelements in dieser Spalte entsprechend seiner Eltern-Kind-Tiefe im Modell, sieht es am Ende wie ein Baum aus, auch wenn es technisch gesehen nur eine flache Liste von Elementen ist.
Einen TreeView deklarieren
TreeView ist ein datengebundenes Steuerelement, daher kann es ohne ein Datenmodell nichts anzeigen. Sie können keine Baumknoten in QML deklarieren.
Wenn Sie ein TreeView deklarieren, müssen Sie folgendes angeben:
- Ein Datenmodell. TreeView kann mit Datenmodellen arbeiten, die von QAbstractItemModel abgeleitet sind.
- Ein Delegat. Ein Delegat ist eine Vorlage, die angibt, wie die Baumknoten in der Benutzeroberfläche angezeigt werden.
TreeView { // The model needs to be a QAbstractItemModel model: myTreeModel // You can set a custom delegate or use a built-in TreeViewDelegate delegate: TreeViewDelegate {} }
Erstellen eines Datenmodells
Ein TreeView akzeptiert nur ein Modell, das QAbstractItemModel erbt.
Informationen zum Erstellen und Verwenden eines benutzerdefinierten Baummodells finden Sie im Beispiel: Qt Quick Controls - Table of Contents.
Anpassen von Baumknoten
Um die Flexibilität zu erhöhen, positioniert TreeView selbst die Delegatenelemente nicht in einer Baumstruktur. Diese Aufgabe wird auf den Delegaten übertragen. Qt Quick Controls bietet ein fertiges TreeViewDelegate an, das dafür verwendet werden kann, was den Vorteil hat, dass es out-of-the-box funktioniert und einen Baum darstellt, der dem Stil der Plattform folgt, auf der die Anwendung läuft.
Auch wenn TreeViewDelegate anpassbar ist, kann es Situationen geben, in denen Sie den Baum auf eine andere Art und Weise rendern wollen oder sicherstellen wollen, dass der Delegat so minimal wie möglich ausfällt, vielleicht aus Leistungsgründen. Die Erstellung eines eigenen Delegaten von Grund auf ist einfach, da TreeView eine Reihe von Eigenschaften bietet, die verwendet werden können, um jeden Knoten im Baum korrekt zu positionieren und darzustellen.
Ein Beispiel für einen benutzerdefinierten Delegaten mit einem animierten Indikator wird unten gezeigt:
import QtQuick import QtQuick.Controls ApplicationWindow { width: 800 height: 600 visible: true TreeView { id: treeView anchors.fill: parent anchors.margins: 10 clip: true selectionModel: ItemSelectionModel {} // The model needs to be a QAbstractItemModel // model: yourTreeModel delegate: Item { implicitWidth: padding + label.x + label.implicitWidth + padding implicitHeight: label.implicitHeight * 1.5 readonly property real indentation: 20 readonly property real padding: 5 // Assigned to by TreeView: required property TreeView treeView required property bool isTreeNode required property bool expanded required property bool hasChildren required property int depth required property int row required property int column required property bool current // Rotate indicator when expanded by the user // (requires TreeView to have a selectionModel) property Animation indicatorAnimation: NumberAnimation { target: indicator property: "rotation" from: expanded ? 0 : 90 to: expanded ? 90 : 0 duration: 100 easing.type: Easing.OutQuart } TableView.onPooled: indicatorAnimation.complete() TableView.onReused: if (current) indicatorAnimation.start() onExpandedChanged: indicator.rotation = expanded ? 90 : 0 Rectangle { id: background anchors.fill: parent color: row === treeView.currentRow ? palette.highlight : "black" opacity: (treeView.alternatingRows && row % 2 !== 0) ? 0.3 : 0.1 } Label { id: indicator x: padding + (depth * indentation) anchors.verticalCenter: parent.verticalCenter visible: isTreeNode && hasChildren text: "▶" TapHandler { onSingleTapped: { let index = treeView.index(row, column) treeView.selectionModel.setCurrentIndex(index, ItemSelectionModel.NoUpdate) treeView.toggleExpanded(row) } } } Label { id: label x: padding + (isTreeNode ? (depth + 1) * indentation : 0) anchors.verticalCenter: parent.verticalCenter width: parent.width - padding - x clip: true text: model.display } } } }
Die Eigenschaften, die als required
markiert sind, werden von TreeView ausgefüllt und sind ähnlich wie angehängte Eigenschaften. Indem der Delegat sie als erforderlich markiert, teilt er TreeView indirekt mit, dass er die Verantwortung für die Zuweisung dieser Werte übernehmen soll. Die folgenden erforderlichen Eigenschaften können zu einem Delegaten hinzugefügt werden:
required property TreeView treeView
- Zeigt auf den TreeView, der das Delegate-Element enthält.required property bool isTreeNode
- Isttrue
, wenn das delegierte Element einen Knoten im Baum darstellt. Es wird nur eine Spalte in der Ansicht verwendet, um den Baum zu zeichnen, und daher haben nur Delegatenelemente in dieser Spalte diese Eigenschaft auftrue
gesetzt. Ein Knoten in der Struktur sollte in der Regel entsprechend seinerdepth
eingerückt werden und einen Indikator anzeigen, wennhasChildren
true
ist. Delegierte Elemente in anderen Spalten haben diese Eigenschaft auffalse
gesetzt und zeigen Daten aus den verbleibenden Spalten im Modell (und sind normalerweise nicht eingerückt).required property bool expanded
- Isttrue
, wenn das vom Delegaten gezeichnete Modellelement in der Ansicht erweitert ist.required property bool hasChildren
- Isttrue
, wenn das vom Delegierten gezeichnete Modellelement Kinder im Modell hat.required property int depth
- Enthält die Tiefe des Modellelements, das vom Delegierten gezeichnet wurde. Die Tiefe eines Modellelements ist gleich der Anzahl der Vorfahren, die es im Modell hat.
Siehe auch Erforderliche Eigenschaften.
Interaktion mit dem Endbenutzer
Standardmäßig zeigt TreeView toggles den aufgeklappten Zustand einer Zeile an, wenn man doppelt auf sie tippt. Da dies im Konflikt mit dem Doppeltippen zum Bearbeiten einer Zelle steht, setzt TreeView editTriggers standardmäßig auf TableView.EditKeyPressed
(was sich von TableView unterscheidet, das TableView.EditKeyPressed | TableView.DoubleTapped
verwendet). Wenn Sie editTriggers so ändern, dass es auch TableView.DoubleTapped
enthält, wird das Umschalten des aufgeklappten Zustands mit einem Doppeltipp deaktiviert.
Eigenschaft Dokumentation
rootIndex : QModelIndex |
Diese Eigenschaft enthält den Modellindex des Wurzelelements in der Baumstruktur. Standardmäßig ist dies derselbe wie der Stammindex im Modell, aber Sie können ihn stattdessen auf einen untergeordneten Index setzen, um nur einen Zweig des Baums anzuzeigen. Setzen Sie ihn auf undefined
, um das gesamte Modell anzuzeigen.
Diese Eigenschaft wurde in Qt 6.6 eingeführt.
Signal Dokumentation
collapsed(row, recursively) |
Dieses Signal wird ausgegeben, wenn eine row in der Ansicht kollabiert. row ist gleich dem Argument, das dem Aufruf, der das Kollabieren verursacht hat, übergeben wurde (collapse() oder collapseRecursively()). Wenn die Zeile rekursiv eingeklappt wurde, ist recursively gleich true
.
Hinweis: Wenn eine Zeile rekursiv kollabiert, wird das Signal "kollabiert" nur für diese eine Zeile ausgegeben und nicht für ihre Nachkommen.
Hinweis: Der entsprechende Handler ist onCollapsed
.
Siehe auch expanded(), expand(), collapse(), und toggleExpanded().
expanded(row, depth) |
Dieses Signal wird ausgegeben, wenn eine row in der Ansicht erweitert wird. row und depth sind gleich den Argumenten, die dem Aufruf, der die Erweiterung verursacht hat, übergeben wurden (expand() oder expandRecursively()). Im Falle von expand() ist depth immer 1
. Im Falle von expandToIndex() ist depth die Tiefe des Zielindexes.
Hinweis: Wenn eine Zeile rekursiv expandiert wird, wird das Expandierungssignal nur für diese eine Zeile ausgegeben, nicht aber für ihre Nachkommen.
Hinweis: Der entsprechende Handler ist onExpanded
.
Siehe auch collapsed(), expand(), collapse(), und toggleExpanded().
Dokumentation der Methode
collapse(row) |
Klappt den Baumknoten an der angegebenen row in der Ansicht zusammen.
row sollte die Zeile in der Ansicht (Tabellenzeile) sein, und nicht eine Zeile im Modell.
Hinweis: Diese Funktion hat keinen Einfluss auf das Modell, sondern nur auf die visuelle Darstellung in der Ansicht.
Siehe auch expand() und isExpanded().
|
Klappt den Baumknoten unter der angegebenen Adresse row in der Ansicht rekursiv bis zu allen Blättern zusammen.
Bei einem Modell mit mehr als einer Wurzel können Sie diese Funktion auch mit row gleich -1
aufrufen. Dadurch werden alle Wurzeln kollabiert. Daher werden durch den Aufruf von collapseRecursively(-1) oder einfach collapseRecursively() alle Knoten des Modells kollabiert.
row sollte die Zeile in der Ansicht (Tabellenzeile) sein, und nicht eine Zeile im Modell.
Hinweis: Diese Funktion beeinflusst nicht das Modell, sondern nur die visuelle Darstellung in der Ansicht.
Diese Methode wurde in Qt 6.4 eingeführt.
Siehe auch expandRecursively(), expand(), collapse(), isExpanded(), und depth().
int depth(row) |
Gibt die Tiefe (die Anzahl der Eltern bis zur Wurzel) der angegebenen row zurück.
row sollte die Zeile in der Ansicht (Tabellenzeile) sein, und nicht eine Zeile im Modell. Wenn row nicht zwischen 0
und rows liegt, ist der Rückgabewert -1
.
Siehe auch modelIndex().
expand(row) |
Erweitert den Baumknoten an der angegebenen row in der Ansicht.
row sollte die Zeile in der Ansicht (Tabellenzeile) sein, und nicht eine Zeile im Modell.
Hinweis: Diese Funktion hat keinen Einfluss auf das Modell, sondern nur auf die visuelle Darstellung in der Ansicht.
Siehe auch collapse(), isExpanded(), und expandRecursively().
|
Erweitert den Baumknoten am angegebenen row in der Ansicht rekursiv bis depth. depth sollte sich auf die Tiefe von row beziehen. Wenn depth gleich -1
ist, wird der Baum bis hinunter zu allen Blättern erweitert.
Bei einem Modell mit mehr als einer Wurzel können Sie diese Funktion auch aufrufen, wenn row gleich -1
ist. Dadurch werden alle Wurzeln expandiert. Daher werden durch den Aufruf von expandRecursively(-1, -1) oder einfach expandRecursively() alle Knoten des Modells aufgeklappt.
row sollte die Zeile in der Ansicht (Tabellenzeile) sein, und nicht eine Zeile im Modell.
Hinweis: Diese Funktion wird nicht versuchen, fetch more Daten.
Hinweis: Diese Funktion hat keinen Einfluss auf das Modell, sondern nur auf die visuelle Darstellung in der Ansicht.
Warnung: Wenn das Modell eine große Anzahl von Elementen enthält, wird die Ausführung dieser Funktion einige Zeit in Anspruch nehmen.
Diese Methode wurde in Qt 6.4 eingeführt.
Siehe auch collapseRecursively(), expand(), collapse(), isExpanded(), und depth().
|
Erweitert den Baum ab dem angegebenen Modell index und rekursiv bis zur Wurzel. Das Ergebnis wird sein, dass das Delegatenelement, das index repräsentiert, in der Ansicht sichtbar wird (es sei denn, es landet außerhalb des Ansichtsfensters). Um sicherzustellen, dass die Zeile im Ansichtsfenster sichtbar wird, können Sie dies tun:
expandToIndex(index) forceLayout() positionViewAtRow(rowAtIndex(index), Qt.AlignVCenter)
Diese Methode wurde in Qt 6.4 eingeführt.
Siehe auch expand() und expandRecursively().
bool isExpanded(row) |
Gibt zurück, ob die angegebene row in der Ansicht als erweitert angezeigt wird.
row sollte die Zeile in der Ansicht (Tabellenzeile) sein, und nicht eine Zeile im Modell. Wenn row nicht zwischen 0
und rows liegt, ist der Rückgabewert false
.
toggleExpanded(row) |
Schaltet um, ob der Baumknoten am angegebenen row aufgeklappt werden soll. Dies ist eine Bequemlichkeit für die Arbeit:
if (isExpanded(row)) collapse(row) else expand(row)
row sollte die Zeile in der Ansicht (Tabellenzeile) sein, und nicht eine Zeile im Modell.
© 2025 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.