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())
运行结果如下图:
测试QTreeView
本文知识点
- 向树状视图添加条目;
- 在条目下添加子条目;
- 获取选中条目的信息;
- 获取条目的相邻条目;
- 设置指定列的宽度;
- 在条目前添加复选框按钮;
- 在节点间添加虚线连接。