在 Python 中,QTreeWidget 是 PyQt5/PyQt6 或 PySide2/PySide6 中用于创建树形控件的类,它提供了一种直观的方式来展示层级数据,比如文件目录、组织架构等。
下面我将详细介绍如何使用 QTreeWidget,包括基本用法、添加节点、设置信号槽、自定义样式等。
基本用法
示例:创建一个简单的树形控件
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTreeWidget, QTreeWidgetItem, QVBoxLayout
class TreeWidgetExample(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# 创建主布局
layout = QVBoxLayout()
# 创建 QTreeWidget
self.tree_widget = QTreeWidget()
self.tree_widget.setHeaderLabels(["Name", "Value"])
# 添加根节点
root_item = QTreeWidgetItem(self.tree_widget, ["Root"])
# 添加子节点
child1 = QTreeWidgetItem(root_item, ["Child 1", "Value 1"])
child2 = QTreeWidgetItem(root_item, ["Child 2", "Value 2"])
# 添加孙节点
grandchild = QTreeWidgetItem(child1, ["Grandchild", "Value 3"])

# 展开根节点
root_item.setExpanded(True)
# 将树形控件添加到布局中
layout.addWidget(self.tree_widget)
# 设置窗口布局
self.setLayout(layout)
self.setWindowTitle("QTreeWidget Example")
self.resize(300, 200)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = TreeWidgetExample()
window.show()
sys.exit(app.exec_())
动态添加节点
你可以动态地向树中添加节点,例如根据用户操作或数据加载。
def add_child_to_item(parent_item, name, value=""):
child = QTreeWidgetItem(parent_item, [name, value])
return child
# 示例:向 root_item 添加新子节点
new_child = add_child_to_item(root_item, "New Child", "New Value")
设置信号槽
QTreeWidget 支持多种信号,
itemClicked:当用户点击某个项目时触发。itemDoubleClicked:当用户双击某个项目时触发。currentItemChanged:当前选中项改变时触发。
示例:处理点击事件
def on_item_clicked(item, column):
print(f"Clicked item: {item.text(column)}")
self.tree_widget.itemClicked.connect(on_item_clicked)
自定义样式
你可以使用 QSS(Qt Style Sheets)来自定义 QTreeWidget 的外观。
示例:设置背景颜色和字体
self.tree_widget.setStyleSheet("""
QTreeWidget {
background-color: #f0f0f0;
font-family: Arial;
font-size: 12px;
}
QTreeWidget::item {
padding: 5px;
}
QTreeWidget::item:selected {
background-color: #0078d7;
color: white;
}
""")
加载数据到树形控件
假设你有一个嵌套的字典结构,可以递归地将其加载到树形控件中。
示例:从字典加载数据
def load_data_to_tree(tree_widget, data, parent_item=None):
for key, value in data.items():
if isinstance(value, dict):
item = QTreeWidgetItem(parent_item, [key])
load_data_to_tree(tree_widget, value, item)
else:
QTreeWidgetItem(parent_item, [key, str(value)])
# 示例数据
data = {
"Root": {
"Child 1": "Value 1",
"Child 2": {
"Grandchild 1": "Value 3",
"Grandchild 2": "Value 4"
}
}
}
# 加载数据
load_data_to_tree(self.tree_widget, data)
禁用某些节点
你可以禁用某些节点,使其不可选。
child1.setFlags(child1.flags() & ~Qt.ItemIsSelectable)
排序节点
你可以对树形控件中的节点进行排序。
self.tree_widget.sortByColumn(0, Qt.AscendingOrder)
搜索节点
你可以遍历树形控件,查找特定节点。
def find_item(tree_widget, text):
items = tree_widget.findItems(text, Qt.MatchExactly)
return items
# 示例:查找名为 "Child 1" 的节点
found_items = find_item(self.tree_widget, "Child 1")
for item in found_items:
print(f"Found item: {item.text(0)}")
QTreeWidget 是一个非常强大的控件,适合展示层级数据,通过结合信号槽、自定义样式和动态数据加载,你可以创建一个功能丰富且美观的树形控件。
如果你有更具体的需求(例如拖放操作、右键菜单等),可以进一步扩展 QTreeWidget 的功能。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/487586.html



