实战PyQt5: 075-树状视图QTreeView

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

  • 18
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
height=10, yscrollcommand=table_scroll_y.set, xscrollcommand=table_scroll_x.set) # 设置表格样式 table.column("#0", width=0, stretch=tk.NO) for i, col in enumerate(header): table.column(col, width=100, stretch=tk.NO) table.heading(col, text=col) # 填充表格数据 for row in self.record_sheet.iter_rows(min_row=2, values_only=True): table.insert("", tk.END, values=row) # 显示第二个表格 header2 = next(self.record_sheet2.iter_rows(min_row=1, max_row=1, values_only=True)) # 创建表格 table2 = ttk.Treeview(self.table_frame2, columns=header2, show='headings', height=10, yscrollcommand=table_scroll_y2.set, xscrollcommand=table_scroll_x2.set) # 设置表格样式 table2.column("#0", width=0, stretch=tk.NO) for i, col in enumerate(header2): table2.column(col, width=100, stretch=tk.NO) table2.heading(col, text=col) # 填充表格数据 for row in self.record_sheet2.iter_rows(min_row=2, values_only=True): table2.insert("", tk.END, values=row) # 显示表格 table.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) table_scroll_y.config(command=table.yview) table_scroll_x.config(command=table.xview) table2.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) table_scroll_y2.config(command=table2.yview) table_scroll_x2.config(command=table2.xview) self.result_text.config(state=tk.NORMAL) self.result_text.insert(tk.END, "Excel表格读取完成!\n") self.result_text.config(state=tk.DISABLED) 这段代码是用来读取 Excel 表格并在界面上显示的。其中,通过 Treeview 控件实现了表格的显示,使用 Scrollbar 实现了滚动条。同时,还支持同时显示两个表格。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值