实战PyQt5: 075-树状视图QTreeView

本文通过实例展示了如何使用QTreeView展示QStandardItemModel数据,包括添加条目、子条目、调整列宽、添加复选框及获取选中条目信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QTreeView简介

QTreeView实现对模型(Model)中的条目(ITEM)的树形显示。它是模型-视图(Model-View)类之一,是Qt模型-视图框架的组成部分。它实现了由QAbstractItemView类定义的接口,因此能够显示从QAbstractItemModel类派生出的模型所提供的数据。模型-视图体系结构确保树形视图的内容随着模型的更改而更新。其表头由QHeaderView类来创建。

一个常见的例子就是使用QFileSystemModel提供的数据,显示成树形视图,用于浏览计算机本地系统中的目录和文件。

fileModel = QFileSystemModel()
fileModel.setRootPath(QDir.currentPath())
treeView = QTreeView(self)
treeView.setModel(fileModel)

QTreeView常用方法:

  • setModel(): 设置所使用的模型;
  • setHeader(): 设置表头;
  • header(): 获得表头对象;
  • indexAbove(): 获得指定索引的前面的索引;
  • indexBelow(): 获得指定索引的后面的索引;
  • collapse(): 折叠指定索引的条目;
  • collapseAll(): 折叠整个树形视图;
  • expand(): 展开指定索引的条目;
  • expandAll(): 展开整个树形视图。

QTreeView常用信号:

  • collapsed: 当条目折叠操作完成时,发射该信号;
  • expanded: 当条目展开操作完成时,发射该信号;

QTreeView类继承关系:

实战PyQt5: 075-树状视图QTreeView

测试QTreeView

测试代码使用QStandardItemModel作为树形视图的模型,演示了怎样用树形视图来展示模型数据,调整列宽以保证条目的文字信息能完整显示,如何在节点间添加虚线连接,演示了如何在条目前添加复选框按钮,以及选中一个条目时,如何获取自身信息,父类的信息,以及相邻条目的信息。完整代码如下:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt,QModelIndex
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTreeView,
                             QAbstractItemView, QHeaderView, QStyleFactory)
 
class DemoTreeView(QMainWindow):
    def __init__(self, parent=None):
        super(DemoTreeView, self).__init__(parent)   
        
         # 设置窗口标题
        self.setWindowTitle('实战PyQt5: QTreeView 演示')      
        # 设置窗口大小
        self.resize(520, 360)
      
        self.initUi()
        
    def initUi(self):
        
        #设置表头信息
        model = QStandardItemModel(self)
        model.setHorizontalHeaderLabels(['项目名称', '信息'])
        
        #添加条目
        itemProject = QStandardItem('项目')
        model.appendRow(itemProject)
        model.setItem(0, 1, QStandardItem('项目信息说明'))
        
        #添加子条目
        itemChild = QStandardItem('文件夹1')
        itemProject.appendRow(itemChild)
        itemProject.setChild(0, 1, QStandardItem('信息说明'))
        
        #继续添加
        itemFolder = QStandardItem('文件夹2')
        itemProject.appendRow(itemFolder)
        for group in range (5):
            itemGroup = QStandardItem('组{}'.format(group+1))
            itemFolder.appendRow(itemGroup)
            for ch in range (group+1):
                itemCh = QStandardItem('成员{}'.format(ch+1))
                #添加复选框
                itemCh.setCheckable(True)
                itemGroup.appendRow(itemCh)
                itemGroup.setChild(itemCh.index().row(), 1, QStandardItem('成员{}信息说明'.format(ch+1)))
        itemProject.setChild(itemFolder.index().row(), 1, QStandardItem('文件夹2信息说明'))
        
        treeView = QTreeView(self)
        treeView.setModel(model)
        #调整第一列的宽度
        treeView.header().resizeSection(0, 160)
        #设置成有虚线连接的方式
        treeView.setStyle(QStyleFactory.create('windows'))
        #完全展开
        treeView.expandAll()
        
        #显示选中行的信息
        treeView.selectionModel().currentChanged.connect(self.onCurrentChanged)
                
        self.model = model
        self.treeView = treeView
        self.setCentralWidget(treeView)
            
    def onCurrentChanged(self,current, previous):
        txt = '父级:[{}] '.format(str(current.parent().data()))
        txt += '当前选中:[(行{},列{})] '.format(current.row(), current.column())
        
        name=''
        info=''
        if current.column() == 0:
            name = str(current.data())
            info = str(current.sibling(current.row(), 1).data())
        else:
            name = str(current.sibling(current.row(), 0).data())
            info = str(current.data())
        
        txt += '名称:[{}]  信息:[{}]'.format(name, info)    
        
        self.statusBar().showMessage(txt)
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = DemoTreeView()
    window.show()
    sys.exit(app.exec())

运行结果如下图:

实战PyQt5: 075-树状视图QTreeView

测试QTreeView

本文知识点

  • 向树状视图添加条目;
  • 在条目下添加子条目;
  • 获取选中条目的信息;
  • 获取条目的相邻条目;
  • 设置指定列的宽度;
  • 在条目前添加复选框按钮;
  • 在节点间添加虚线连接。

前一篇: 实战PyQt5: 074-表格部件QTableWidget

PyQt5中的`QTreeView`是一个树型视图组件,用于显示组织良好的数据列表,而`QSortFilterProxyModel`是一个中间模型,它在原始数据模型(如`QStandardItemModel`或`QSqlTableModel`)和视图之间起到过滤和排序的作用。 当你需要对数据源进行过滤和排序后再展示给用户时,`QSortFilterProxyModel`非常有用。它的工作原理是接收来自视图的信号(如`sort()`或`filterAcceptsRow()`),然后处理这些请求,决定是否将数据传递到视图,或者如何排序数据。 以下是如何在`QTreeView`中使用`QSortFilterProxyModel`的基本步骤: 1. **创建模型**: 首先创建你要过滤和排序的数据模型。 2. **创建代理模型**: 创建一个`QSortFilterProxyModel`实例。 ```python proxy_model = QSortFilterProxyModel() ``` 3. **设置代理模型**: 将代理模型连接到原始数据模型上。 ```python proxy_model.setSourceModel(original_model) ``` 4. **设置过滤条件**: 当需要过滤数据时,调用代理模型的`setFilterRegExp()`方法设置正则表达式或其他过滤规则。 ```python proxy_model.setFilterRegExp("search pattern") ``` 5. **设置排序选项**: 使用`sort()`方法设置排序依据和顺序。 ```python proxy_model.sort(column_index, Qt.AscendingOrder) # 指定列索引和排序方向 ``` 6. **应用代理模型到QTreeView**: 将代理模型绑定到`QTreeView`,以便它显示经过过滤和排序的数据。 ```python view.setModel(proxy_model) ``` 7. **监听视图信号**: 观察视图发出的信号(如`aboutToSort()`和`sorted()`),以保持代理模型的状态同步。 ```python view.clicked.connect(lambda index: proxy_model.setFilterFixedString(index.data(Qt.DisplayRole))) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值