程序员的知识教程库

网站首页 > 教程分享 正文

实战PyQt5: 075-树状视图QTreeView

henian88 2024-08-15 21:57:58 教程分享 10 ℃ 0 评论

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类继承关系:

测试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())

运行结果如下图:

本文知识点

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

喜欢本文内容就关注, 收藏,点赞,评论和转发。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表