In PyQt6, QTreeView displays hierarchical data from a model; it does not store that data itself. Use QStandardItemModel for a tree you build in memory, QFileSystemModel for local files and directories, and QSortFilterProxyModel when you need filtering or sorting between a model and the view.
How PyQt6 QTreeView and models work
Qt separates data, presentation, and item interaction. A model exposes data and its hierarchy, a view such as QTreeView displays it, and a delegate handles standard item presentation and editing. The model must represent parent-child relationships for the view to show a tree; setting a flat model on a tree view does not create meaningful hierarchy by itself. This separation also lets one model feed different views without duplicating the underlying data. See the Qt model/view programming tutorial and QTreeView documentation.
Choose a model based on where your data lives:
| Model | Use it when | What it represents |
|---|---|---|
QStandardItemModel |
You are assembling a relatively direct, in-memory tree. | Rows of QStandardItem objects, with text, child rows, checkable state, and other item data. |
A custom QAbstractItemModel subclass |
Your application already owns structured data or needs specialized behavior. | Your own data source, exposed through Qt’s model interface. |
QFileSystemModel |
You want to browse local files and directories. | Local file-system contents. |
Qt for Python documents these standard models and describes QTreeView as a suitable view for file-system content: Model/View Programming overview for Qt for Python.
Build an in-memory tree with QStandardItemModel
This runnable example creates a small, two-level tree. Install a PyQt6 release in your Python environment, save the code as a Python file, and run it. The example uses the PyQt6 Qt Widgets imports and enum spelling shown below.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →#1 Best Overall
- Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
- Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
- Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
- Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
- 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.
import sys
from PyQt6.QtGui import QStandardItem, QStandardItemModel
from PyQt6.QtWidgets import QApplication, QTreeView
app = QApplication(sys.argv)
model = QStandardItemModel()
model.setHorizontalHeaderLabels(["Project"])
frontend = QStandardItem("Frontend")
frontend.appendRow(QStandardItem("Login page"))
frontend.appendRow(QStandardItem("Dashboard"))
backend = QStandardItem("Backend")
backend.appendRow(QStandardItem("Authentication API"))
backend.appendRow(QStandardItem("Reports API"))
model.appendRow(frontend)
model.appendRow(backend)
view = QTreeView()
view.setModel(model)
view.setWindowTitle("Project tasks")
view.resize(420, 300)
view.show()
sys.exit(app.exec())
appendRow() adds a top-level item or a child row beneath a parent. The view reads that structure through setModel(). For larger or application-owned data, a custom model can avoid representing the same information again as a second collection of item objects. Qt’s model/view tutorial explains the standard item model and the model interface: Qt model/view programming.
Add model-backed checkboxes
Checkboxes are item state, not a separate feature stored by the view. With standard items, mark an item checkable and initialize its check state. Qt’s item-view machinery and default delegate present and edit that state.
Rank #2
- 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
- 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
- Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
- 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
- What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QStandardItem
item = QStandardItem("Include generated files")
item.setCheckable(True)
item.setCheckState(Qt.CheckState.Unchecked)
model.appendRow(item)
Use Qt.CheckState.Checked instead when the item should start checked. You can read a standard item’s current state with item.checkState(); if you need a view index, read the model’s check-state role for that index.
A custom model must expose check state and accept edits itself. In practical terms, its data implementation returns check-state data for Qt.ItemDataRole.CheckStateRole; its flags mark the relevant item as user-checkable and enabled; and its data-setting implementation handles that role by storing the new state and notifying the view that data changed. Merely drawing a checkbox is not enough if the model does not store updates. Qt’s model/view documentation describes roles, item flags, and standard-item checkbox support: Qt model/view programming tutorial.
PC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchRank #3
- Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
- Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
- Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
- Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
- What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.
Parent-child checkbox propagation is separate application logic. Checking a parent does not, by itself, establish that all children should be checked, or that a parent should become partially checked when only some children are selected. Implement those rules explicitly if your interface requires them.
Show local files with QFileSystemModel
For a file-browser tree, create a QFileSystemModel, set its root path, and give the model to the view. To show only a chosen directory rather than the model’s broader root, pass the directory’s model index to setRootIndex().
Rank #4
- Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
- Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
- Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
- Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
- Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft
import sys
from PyQt6.QtCore import QDir
from PyQt6.QtWidgets import QApplication, QFileSystemModel, QTreeView
app = QApplication(sys.argv)
model = QFileSystemModel()
model.setRootPath(QDir.currentPath())
view = QTreeView()
view.setModel(model)
view.setRootIndex(model.index(QDir.currentPath()))
view.setWindowTitle("Current directory")
view.resize(700, 420)
view.show()
sys.exit(app.exec())
Here, QDir.currentPath() supplies the directory used for both the model root and the visible tree root. Replace it with another local directory path to browse that location. The model represents file-system information; the tree view provides the familiar expansion and selection interface. Qt’s documented directory example follows the same model-and-view pattern: QTreeView documentation and Qt for Python model/view overview.
Filter a tree from a search field
A QSortFilterProxyModel sits between the source model and the view. The line edit updates the proxy’s filter, while the tree displays the filtered result. This example filters the first column of a standard-item tree, case-insensitively, and uses Qt’s recursive filtering property so a matching descendant can remain visible with its ancestor path. Confirm that the recursive-filtering property is available and behaves as expected in the exact Qt version used by your PyQt6 installation.
Best Value
- 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
- Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
- Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
- HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
- What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.
import sys
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QStandardItem, QStandardItemModel
from PyQt6.QtWidgets import (
QApplication,
QLineEdit,
QSortFilterProxyModel,
QTreeView,
QVBoxLayout,
QWidget,
)
app = QApplication(sys.argv)
source = QStandardItemModel()
source.setHorizontalHeaderLabels(["Project"])
for group, tasks in {
"Frontend": ["Login page", "Dashboard"],
"Backend": ["Authentication API", "Reports API"],
}.items():
parent = QStandardItem(group)
for task in tasks:
parent.appendRow(QStandardItem(task))
source.appendRow(parent)
proxy = QSortFilterProxyModel()
proxy.setSourceModel(source)
proxy.setFilterCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive)
proxy.setFilterKeyColumn(0)
proxy.setRecursiveFilteringEnabled(True)
search = QLineEdit()
search.setPlaceholderText("Search projects and tasks")
search.textChanged.connect(proxy.setFilterFixedString)
view = QTreeView()
view.setModel(proxy)
window = QWidget()
layout = QVBoxLayout(window)
layout.addWidget(search)
layout.addWidget(view)
window.setWindowTitle("Search project tasks")
window.resize(460, 340)
window.show()
sys.exit(app.exec())
Filtering is also a user-experience decision. Decide whether the search should inspect only a particular column or several, whether matching should be case-sensitive, and whether a matching parent should expose all of its children. The example searches column zero and preserves ancestor paths for descendant matches; it does not define a special rule to reveal every child of a matching parent. Qt documents proxy models as a way to sort or filter another model and supports customizing filtering through subclassing: QSortFilterProxyModel documentation.
If the built-in behavior does not match the desired tree policy, subclass QSortFilterProxyModel and implement filterAcceptsRow() with the required parent and descendant checks. When application code obtains an index from the view while a proxy is installed, that index belongs to the proxy. Use mapToSource() when you need the corresponding source-model index. Qt for Python documents model/view mapping concepts in its Model/View Programming overview.
Choose useful QTreeView behavior
Keep view settings focused on the tree’s task. For example, hide headers for a single-column task hierarchy, expand a selected branch when opening the window, or tune indentation for nested levels. These settings change presentation; they do not change the model’s data.
setHeaderHidden(True)hides the header when column labels are not useful.setIndentation(pixels)adjusts the visual offset of child levels.expand(index)andexpandAll()control which branches are initially open.- Root decoration controls how the root item is drawn; choose it according to whether the root is itself meaningful to users.
- Uniform row heights can help only when every row is guaranteed to have the same height; do not enable the setting if rows can vary.
Sorting is disabled by default for QTreeView. With QStandardItemModel, populate the items first and enable sorting afterward when needed, rather than sorting during every insertion. See QTreeView documentation for view properties and sorting behavior.
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Scan for outdated or missing drivers - takes under a minute3Repair Windows errors before they cause bigger problemsQuick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

