PyQt6/PySide6 的 QTreeView 类

news2025/2/7 20:45:20

QTreeView 是 PyQt6 或 PySide6 库中用于显示分层数据的控件。它适用于展示树形结构的数据,如文件系统、组织结构等。QTreeView 也是基于模型-视图架构的,通常与 QAbstractItemModel 的子类(如 QStandardItemModel 或自定义模型)一起使用。下面我将详细介绍 QTreeView 的主要特性及其使用方法。

1. 基本概念

  • 树形视图:用于显示分层数据的控件。
  • 模型-视图架构QTreeView 使用模型-视图架构,其中 QTreeView 是视图部分,负责显示数据;而模型(如 QStandardItemModel)则负责管理数据。
  • 节点:树形结构中的基本单位,每个节点可以有子节点。
  • 根节点:树形结构的最顶层节点。
  • 展开/折叠:控制节点的显示状态,展开时显示其子节点,折叠时隐藏其子节点。
  • 选择模式:控制用户如何选择节点。
  • 编辑模式:允许用户直接在树形视图中编辑数据。

2. 创建 QTreeView 实例

要使用 QTreeView,首先需要导入相应的库:

from PyQt6.QtWidgets import QApplication, QTreeView, QVBoxLayout, QWidget, QPushButton
from PyQt6.QtGui import QStandardItemModel, QStandardItem
# 或者
from PySide6.QtWidgets import QApplication, QTreeView, QVBoxLayout, QWidget, QPushButton
from PySide6.QtGui import QStandardItemModel, QStandardItem

接着创建一个窗口,并在其中添加 QTreeView 控件:

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("我的应用程序")
        self.setGeometry(100, 100, 800, 600)
      
        # 初始化UI
        self.initUI()
  
    def initUI(self):
        layout = QVBoxLayout()
      
        # 创建树形视图
        self.tree_view = QTreeView(self)
      
        # 创建模型
        self.model = QStandardItemModel()
        self.model.setHorizontalHeaderLabels(['名称', '类型'])
      
        # 添加数据
        root_item = self.model.invisibleRootItem()
        item1 = QStandardItem('项目1')
        item1.appendRow([QStandardItem('子项目1.1'), QStandardItem('类型A')])
        item1.appendRow([QStandardItem('子项目1.2'), QStandardItem('类型B')])
        root_item.appendRow(item1)
      
        item2 = QStandardItem('项目2')
        item2.appendRow([QStandardItem('子项目2.1'), QStandardItem('类型C')])
        item2.appendRow([QStandardItem('子项目2.2'), QStandardItem('类型D')])
        root_item.appendRow(item2)
      
        # 设置模型到视图
        self.tree_view.setModel(self.model)
      
        # 添加按钮
        button = QPushButton("打印选中项", self)
        button.clicked.connect(self.print_selection)
      
        # 添加到布局
        layout.addWidget(self.tree_view)
        layout.addWidget(button)
      
        self.setLayout(layout)
  
    def print_selection(self):
        selected_indices = self.tree_view.selectedIndexes()
        for index in selected_indices:
            row = index.row()
            column = index.column()
            value = index.data()
            print(f"行: {row}, 列: {column}, 值: {value}")

if __name__ == "__main__":
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec()

3. QTreeView 的常用属性和方法

属性
  • model:获取或设置当前使用的模型。
  • selectionModel:获取或设置当前的选择模型。
  • currentIndex:获取或设置当前选中的索引。
  • header:获取表头。
  • rootIndex:获取或设置根索引。
  • alternatingRowColors:获取或设置是否交替行颜色。
  • showGrid:获取或设置是否显示网格线。
  • gridStyle:获取或设置网格线样式。
  • wordWrap:获取或设置是否启用自动换行。
  • resizeMode:获取或设置调整大小模式。
  • selectionBehavior:获取或设置选择行为(选择单元格、行或列)。
  • selectionMode:获取或设置选择模式(单选或多选)。
  • editTriggers:获取或设置编辑触发器。
  • toolTip:获取或设置工具提示文本。
  • statusTip:获取或设置状态栏提示文本。
方法
  • setModel(QAbstractItemModel):设置当前使用的模型。
  • model() -> QAbstractItemModel:获取当前使用的模型。
  • setSelectionModel(QItemSelectionModel):设置当前的选择模型。
  • selectionModel() -> QItemSelectionModel:获取当前的选择模型。
  • setCurrentIndex(QModelIndex):设置当前选中的索引。
  • currentIndex() -> QModelIndex:获取当前选中的索引。
  • header() -> QHeaderView:获取表头。
  • setRootIndex(QModelIndex):设置根索引。
  • rootIndex() -> QModelIndex:获取根索引。
  • setAlternatingRowColors(bool):设置是否交替行颜色。
  • alternatingRowColors() -> bool:判断是否交替行颜色。
  • setShowGrid(bool):设置是否显示网格线。
  • showGrid() -> bool:判断是否显示网格线。
  • setGridStyle(Qt.PenStyle):设置网格线样式。
  • gridStyle() -> Qt.PenStyle:获取网格线样式。
  • setWordWrap(bool):设置是否启用自动换行。
  • wordWrap() -> bool:判断是否启用自动换行。
  • setResizeMode(QHeaderView.ResizeMode):设置调整大小模式。
  • resizeMode() -> QHeaderView.ResizeMode:获取调整大小模式。
  • setSelectionBehavior(QAbstractItemView.SelectionBehavior):设置选择行为。
  • selectionBehavior() -> QAbstractItemView.SelectionBehavior:获取选择行为。
  • setSelectionMode(QAbstractItemView.SelectionMode):设置选择模式。
  • selectionMode() -> QAbstractItemView.SelectionMode:获取选择模式。
  • setEditTriggers(QAbstractItemView.EditTrigger):设置编辑触发器。
  • editTriggers() -> QAbstractItemView.EditTrigger:获取编辑触发器。
  • setToolTip(str):设置工具提示文本。
  • toolTip() -> str:获取工具提示文本。
  • setStatusTip(str):设置状态栏提示文本。
  • statusTip() -> str:获取状态栏提示文本。
  • expand(QModelIndex):展开指定索引的节点。
  • collapse(QModelIndex):折叠指定索引的节点。
  • expandAll():展开所有节点。
  • collapseAll():折叠所有节点。
  • selectRow(int):选择指定行。
  • selectColumn(int):选择指定列。
  • clearSelection():清除选择。
  • selectAll():全选。
  • selectedIndexes() -> List[QModelIndex]:获取所有选中的索引。
  • resizeColumnToContents(int column):根据内容调整指定列宽。
  • resizeRowToContents(int row):根据内容调整指定行高。
  • hideColumn(int column):隐藏指定列。
  • showColumn(int column):显示指定列。
  • hideRow(int row):隐藏指定行。
  • showRow(int row):显示指定行。

4. 详细示例

设置模型
# 创建模型
model = QStandardItemModel()
model.setHorizontalHeaderLabels(['名称', '类型'])

# 添加数据
root_item = model.invisibleRootItem()
item1 = QStandardItem('项目1')
item1.appendRow([QStandardItem('子项目1.1'), QStandardItem('类型A')])
item1.appendRow([QStandardItem('子项目1.2'), QStandardItem('类型B')])
root_item.appendRow(item1)

item2 = QStandardItem('项目2')
item2.appendRow([QStandardItem('子项目2.1'), QStandardItem('类型C')])
item2.appendRow([QStandardItem('子项目2.2'), QStandardItem('类型D')])
root_item.appendRow(item2)

# 设置模型到视图
tree_view.setModel(model)
获取当前选中的索引
def print_selection():
    selected_indices = tree_view.selectedIndexes()
    for index in selected_indices:
        row = index.row()
        column = index.column()
        value = index.data()
        print(f"行: {row}, 列: {column}, 值: {value}")
展开和折叠节点
# 展开指定索引的节点
tree_view.expand(tree_view.model().index(0, 0))

# 折叠指定索引的节点
tree_view.collapse(tree_view.model().index(0, 0))

# 展开所有节点
tree_view.expandAll()

# 折叠所有节点
tree_view.collapseAll()
选择行或列
# 选择第1行
tree_view.selectRow(1)

# 选择第2列
tree_view.selectColumn(2)
清除选择
tree_view.clearSelection()
全选
tree_view.selectAll()
根据内容调整列宽和行高
# 根据内容调整第1列的宽度
tree_view.resizeColumnToContents(1)

# 根据内容调整第1行的高度
tree_view.resizeRowToContents(1)
隐藏和显示列或行
# 隐藏第2列
tree_view.hideColumn(2)

# 显示第2列
tree_view.showColumn(2)

# 隐藏第3行
tree_view.hideRow(3)

# 显示第3行
tree_view.showRow(3)
启用或禁用排序
tree_view.setSortingEnabled(True)  # 启用排序
tree_view.setSortingEnabled(False)  # 禁用排序
设置选择行为
tree_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)  # 选择整行
tree_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectColumns)  # 选择整列
tree_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectItems)  # 选择单元格
设置选择模式
tree_view.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)  # 单选
tree_view.setSelectionMode(QAbstractItemView.SelectionMode.ContiguousSelection)  # 连续多选
tree_view.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)  # 扩展多选
tree_view.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection)  # 多选
设置编辑触发器
tree_view.setEditTriggers(QAbstractItemView.EditTrigger.DoubleClicked | QAbstractItemView.EditTrigger.SelectedClicked)  # 双击或选中后点击编辑
设置工具提示和状态栏提示
tree_view.setToolTip("这是一个树形视图")
tree_view.setStatusTip("查看和编辑数据")

5. 信号与槽机制

QTreeView 支持多种信号,这些信号可以在用户交互时发射。常见的信号包括 clickeddoubleClickedpressedactivatedselectionChanged。你可以通过连接这些信号到槽函数来处理用户的输入事件。

def on_clicked(index):
    row = index.row()
    column = index.column()
    value = index.data()
    print(f"点击: 行: {row}, 列: {column}, 值: {value}")

def on_double_clicked(index):
    row = index.row()
    column = index.column()
    value = index.data()
    print(f"双击: 行: {row}, 列: {column}, 值: {value}")

def on_pressed(index):
    row = index.row()
    column = index.column()
    value = index.data()
    print(f"按下: 行: {row}, 列: {column}, 值: {value}")

def on_activated(index):
    row = index.row()
    column = index.column()
    value = index.data()
    print(f"激活: 行: {row}, 列: {column}, 值: {value}")

def on_selection_changed(selected, deselected):
    print("选择发生变化")

tree_view.clicked.connect(on_clicked)
tree_view.doubleClicked.connect(on_double_clicked)
tree_view.pressed.connect(on_pressed)
tree_view.activated.connect(on_activated)
tree_view.selectionModel().selectionChanged.connect(on_selection_changed)

6. 自定义样式

除了使用内置的样式设置外,你还可以通过样式表(QSS)来自定义 QTreeView 的外观。样式表类似于CSS,提供了强大的样式控制能力。

tree_view.setStyleSheet("""
    QTreeView {
        background-color: #f0f0f0;
        alternate-background-color: #e0e0e0;
        selection-background-color: #0078d7;
        selection-color: white;
        gridline-color: #cccccc;
        border: 1px solid #cccccc;
    }
    QTreeView::item {
        padding: 5px;
    }
    QTreeView::item:selected {
        background-color: #0078d7;
        color: white;
    }
    QTreeView::item:hover {
        background-color: #d0d0d0;
    }
    QTreeView::item:focus {
        outline: none;
    }
    QHeaderView::section {
        background-color: #e0e0e0;
        border: 1px solid #cccccc;
        padding: 5px;
    }
    QHeaderView::section:checked {
        background-color: #0078d7;
        color: white;
    }
""")

7. 动态更新和控制

你可以动态地更新 QTreeView 的内容,或者根据某些条件控制其行为。例如,在定时器或其他事件触发时更新树形视图的数据。

import time
from PyQt6.QtCore import QTimer

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("我的应用程序")
        self.setGeometry(100, 100, 800, 600)
      
        # 初始化UI
        self.initUI()
      
        # 创建定时器
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_tree_view)
        self.timer.start(5000)  # 每5秒触发一次
  
    def initUI(self):
        layout = QVBoxLayout()
      
        # 创建树形视图
        self.tree_view = QTreeView(self)
      
        # 创建模型
        self.model = QStandardItemModel()
        self.model.setHorizontalHeaderLabels(['名称', '类型'])
      
        # 添加数据
        root_item = self.model.invisibleRootItem()
        item1 = QStandardItem('项目1')
        item1.appendRow([QStandardItem('子项目1.1'), QStandardItem('类型A')])
        item1.appendRow([QStandardItem('子项目1.2'), QStandardItem('类型B')])
        root_item.appendRow(item1)
      
        item2 = QStandardItem('项目2')
        item2.appendRow([QStandardItem('子项目2.1'), QStandardItem('类型C')])
        item2.appendRow([QStandardItem('子项目2.2'), QStandardItem('类型D')])
        root_item.appendRow(item2)
      
        # 设置模型到视图
        self.tree_view.setModel(self.model)
      
        # 添加到布局
        layout.addWidget(self.tree_view)
      
        self.setLayout(layout)
  
    def update_tree_view(self):
        # 更新模型数据
        self.model.clear()
        self.model.setHorizontalHeaderLabels(['名称', '类型'])
      
        # 添加新的数据
        root_item = self.model.invisibleRootItem()
        item1 = QStandardItem('项目1 (更新)')
        item1.appendRow([QStandardItem('子项目1.1 (更新)'), QStandardItem('类型A')])
        item1.appendRow([QStandardItem('子项目1.2 (更新)'), QStandardItem('类型B')])
        root_item.appendRow(item1)
      
        item2 = QStandardItem('项目2 (更新)')
        item2.appendRow([QStandardItem('子项目2.1 (更新)'), QStandardItem('类型C')])
        item2.appendRow([QStandardItem('子项目2.2 (更新)'), QStandardItem('类型D')])
        root_item.appendRow(item2)

if __name__ == "__main__":
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec()

总结

QTreeView 是 PyQt6/PySide6 中非常强大且灵活的控件,适用于各种需要展示和编辑树形结构数据的场景。通过设置不同的属性和使用样式表,你可以创建出丰富多样的树形视图样式。同时,通过信号与槽机制,你可以方便地处理用户的输入事件。希望以上内容能帮助你更好地理解和运用 QTreeView,并能够根据具体需求创建出功能丰富且用户友好的树形视图控件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2293684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一键开启/关闭deepseek

一键开启/关闭 Deepseek对应下载的模型一键开启 Deepseek,一键关闭Deepseek双击对应的bat,就可以启动https://mbd.pub/o/bread/Z56YmpZvbat 下载:https://mbd.pub/o/bread/Z56YmpZv 可以自己写下来,保存成bat文件,也可…

单纯接入第三方模型就无需算法备案了么?

随着人工智能技术的快速发展,越来越多的企业开始接入第三方模型以提升自身业务能力。然而,关于算法备案的问题也引发了诸多讨论,尤其是单纯接入第三方模型是否需要备案这一问题,更是让不少企业感到困惑。 一、明确算法备案的主体…

DS图(中)(19)

文章目录 前言一、图的遍历广度优先遍历深度优先遍历 二、最小生成树Kruskal算法Prim算法两种方法对比 总结 前言 承上启下,我们来学习下图的中篇!!! 一、图的遍历 图的遍历指的是遍历图中的顶点,主要有 广度优先遍历 …

YK人工智能(六)——万字长文学会基于Torch模型网络可视化

1. 可视化网络结构 随着深度神经网络做的的发展,网络的结构越来越复杂,我们也很难确定每一层的输入结构,输出结构以及参数等信息,这样导致我们很难在短时间内完成debug。因此掌握一个可以用来可视化网络结构的工具是十分有必要的…

Gitea+Gridea 创建个人博客

历史文档存档,该方法目前已经无法使用,部署方法可供参考 Gitea部分 1.关于Gitea Gitea 是一个面向开源及私有软件项目的托管平台,是全球最大的代码托管平台之一。它采用 Git 分布式版本控制系统,为开发者提供了代码托管、版本控…

【Linux】一文带你入门了解线程和虚拟地址空间中页表映射的秘密(内附手绘底层逻辑图 通俗易懂)

绪论​ 每日激励:“努力去做自己该做的,但是不要期待回报,不是付出了就会有回报的,做了就不要后悔,不做才后悔。—Jack” 绪论​: 本章是LInux中非常重要的线程部分,通过了解线程的基本概念&am…

Flash Attention与Attention

原始Attention是: Flash Attention: 伪代码:4d(分别代表Q\K\V\O) Flash Attention2优化了

JAVA进阶之线程

为神马有线程?这玩意儿在干嘛??? 回答这个问题,就先要知道一点点计算机的工作方式。 总所周知,计算机有五部分:输入输出、计算器、存储器、控制器。而在计算机内,CPU、内存、I/O之…

机器学习专业毕设选题推荐合集 人工智能

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

C++ 中的 `string` 类型:全面解析与高效操作

C 中的 string 类型:全面解析与高效操作 在 C 中,string 类型是对字符数组的高级封装,它提供了大量内置函数,使得字符串的处理变得更为简便和高效。与 C 风格的字符数组不同,string 类型不仅自动管理内存,…

Java入门进阶

文章目录 1、常用API 1.1、Math1.2、System1.3、Object1.4、Arrays1.5、基本类型包装类 1.5.1、基本类型包装类概述1.5.2、Integer1.5.3、int和String相互转换1.5.4、自动装箱和拆箱 1.6、日期类 1.6.1、Date类1.6.2、SimpleDateFormat类 1.6.2.1、格式化(从Date到…

C#结合html2canvas生成切割图片并导出到PDF

目录 需求 开发运行环境 实现 生成HTML范例片断 HTML元素转BASE64 BASE64转图片 切割长图片 生成PDF文件 小结 需求 html2canvas 是一个 JavaScript 库,它可以把任意一个网页中的元素(包括整个网页)绘制到指定的 canvas 中&#xf…

485网关数据收发测试

目录 1.UDP SERVER数据收发测试 使用产品: || ZQWL-GW1600NM 产品||【智嵌物联】智能网关型串口服务器 1.UDP SERVER数据收发测试 A(TX)连接RX B(RX)连接TX 打开1个网络调试助手,模拟用户的UDP客户端设…

InnoDB和MyISAM的比较、水平切分和垂直切分、主从复制中涉及的三个线程、主从同步的延迟产生和解决

InnoDB和MyISAM的比较 事务支持: InnoDB支持:支持事务 (ACID 属性)。支持 Commit、Rollback 和 Savepoint 操作。适合需要事务处理的应用,例如银行系统。MyISAM:不支持事务。每次操作都是自动提交,不能回滚或中止。适合对事务要求…

JDK9新特性

文章目录 新特性:1.模块化系统使用模块化module-info.java:exports:opens:requires:provides:uses: 2.JShell启动Jshell执行计算定义变量定义方法定义类帮助命令查看定义的变量:/var…

基于Ubuntu2404搭建Zabbix7.2

Zabbix 搭建zabbix zabbix7.2已推出:官网 增加的新功能如下: 1.使用新的热门商品小部件全面概览指标 数据概览小部件已转换为热门项目小部件使用项目模式可以实现细粒度的项目选择利用条形图、指标和迷你图来可视化您的数据定义价值阈值以动态地可视化…

Math Reference Notes: 符号函数

1. 符号函数的定义 符号函数(Sign Function) sgn ( x ) \text{sgn}(x) sgn(x) 是一个将实数 ( x ) 映射为其 符号值(即正数、负数或零)的函数。 它的定义如下: sgn ( x ) { 1 如果 x > 0 0 如果 x 0 − 1 如…

【数据结构】链表应用-链表重新排序

重新排序 反转链表预期实现思路解题过程code力扣代码核心代码完整代码 总结 删除链表中间节点代码解惑 链表重新排序题目描述解题思路解题过程复杂度代码力扣代码完整代码 反转链表 预期实现 思路 你选用何种方法解题? 我选用了迭代法来反转链表。这是一种经典且高…

学习threejs,pvr格式图片文件贴图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️PVR贴图1.2 ☘️THREE.Mesh…

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题2)-网络部分解析-附详细代码

目录 附录1:拓扑图​编辑 附录2:地址规划表 1.SW1 2.SW2 3.SW3 4.SW4 5.SW5 6.SW6 7.SW7 8.R1 9.R2 10.R3 11.AC1 12.AC2 13.EG1 14.EG2 15.AP2 16.AP3 附录1:拓扑图 附录2:地址规划表