1 QTreeWidget树类
QTreeWidget类可以呈现数组、数列等数据,并且可以进行交互,它使用标准的数据模型,其单元格数据通过QTableWidgetItem对象来实现。
QTreeWidget继承自QTreeView,是封装了默认Model的QTreeView,其中的元素属于QTreeWidgetItem类型,插入后就是树节点,delete方法可以删除节点。
QTreeWidget常用方法如下:
方法 | 描述 |
---|---|
setColumn Width(列,宽度) | 设置指定列的宽度 |
insertTopLevelItems() | 在视图的顶层索引中插入项目列表 |
expandAll() | 展开所有树形节点 |
invisibleRootItem() | 返回树形控件中不可见的根选项(Root Item) |
selectedItems() | 返回所有选定的非隐藏项目的列表 |
QTreeWidgetItem类常用的方法如下:
方法 | 描述 |
---|---|
addChild() | 将子项追加到子列表中 |
setText() | 设置显示的节点文本 |
Text() | 返回显示的节点文本 |
setCheckState(列,状态) | 设置指定列的选中状态(Qt.CheckState.X): Checked:节点选中 UnChecked:节点未选中 |
setIcon(列,图标) | 在指定的列中显示图标 |
2 树和节点
树形结构是通过QTreeWidget和QTreeWidgetItem类实现的,前者为树,后者为节点。QTreeWidget对象创建后是没有任何项的,首先要增加顶层项,方法有以下三种。
(1)在QTreeWidgetItem中构造方法时,直接将QTreeWidget对象作为参数传递进去。
(2)利用QTreeWidget的隐形根节点,调用QTreeWidgetItem相关方法增加子项即可。
(3)直接调用QTreeWidget相关方法。
追加顶层项:树对象创建以后,通过addTopLevelItem(QTreeWidgetItem item)方法在顶层项加入item项的顶层项,也可以通过addTopLevelItems(iter[QTreeWidgetItem] items)将一个迭代类型items中的多个项加入顶层项的最后。
如果要插入的项已经在树对象中,则该项不会重复加入,如果是多项中有部分项已经在树对象中,则重复项不会加入。
插入顶层项:通过insertTopLevelItem(int index, QTreeWidgetItem item)方法在树对象顶层项列表的index位置插入item对应项,该位置及其后的项目自动后移,也可以通过insertTopLevelItems(int index,(iter[QTreeWidget] items))将一个迭代类型items中多个项从index位置开始顺序插入,原位置的项自动后移。
3 案例
# -*- coding:utf-8 -*-
"""
------------------------------------------------
File Name: 树的动态节点.py
Description:
Author: lzq
date:2024-08-02 09:42
------------------------------------------------
"""
import sys
from PyQt6.QtWidgets import QDialog, QPushButton, QVBoxLayout, QApplication, QWidget, QHBoxLayout, QTreeWidget, \
QTreeWidgetItem, QLineEdit
class MyWidget(QWidget):
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
self.setWindowTitle("TreeWidget测试")
#设置3个命令按钮,水平布局
hLayBtn=QHBoxLayout()
pbAdd=QPushButton('添加')
pbUpdate=QPushButton('修改')
pbDel=QPushButton('删除')
pbAdd.clicked.connect(self.addTreeNode)
pbUpdate.clicked.connect(self.updateTreeNode)
pbDel.clicked.connect(self.delTreeNode)
hLayBtn.addWidget(pbAdd)
hLayBtn.addWidget(pbUpdate)
hLayBtn.addWidget(pbDel)
#树tree:设置列数为1,“名称”标题,设置树节点
self.tree=QTreeWidget(self)
self.tree.setColumnCount(1)
self.tree.setHeaderLabels(['名称'])#设置标题
#在tree中创建root节点
root=QTreeWidgetItem(self.tree)
root.setText(0,'学校')
#在root中创建child1节点
childXy1=QTreeWidgetItem(root)
childXy1.setText(0,'学院1')
childXy2 = QTreeWidgetItem(root)
childXy2.setText(0, '学院2')
childXi = QTreeWidgetItem(childXy2)
childXi.setText(0, '1系')
#root节点作为顶层节点
self.tree.addTopLevelItem(root)
self.tree.expandAll()
#把1个单元行文本框、水平布局的4个命令按钮和树进行垂直布局
vLayout=QVBoxLayout(self)
self.le=QLineEdit()
vLayout.addWidget(self.le)
vLayout.addLayout(hLayBtn)
vLayout.addWidget(self.tree)
self.setLayout(vLayout)
#添加节点
def addTreeNode(self):
item=self.tree.currentItem()
newNode=QTreeWidgetItem(item)
txt =self.le.text()
if txt != '':
newNode.setText(0, txt)
#更新节点
def updateTreeNode(self):
item=self.tree.currentItem()
txt =self.le.text()
if txt != '':
item.setText(0, txt)
#删除节点
def delTreeNode(self):
item=self.tree.currentItem()
root=self.tree.invisibleRootItem()
for item in self.tree.selectedItems():
(item.parent() or root).removeChild(item)
if __name__=='__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec())
思路如下:
(1) 创建单行文本框、3个命令按钮、树及初始节点
#设置3个命令按钮,水平布局
hLayBtn=QHBoxLayout()
pbAdd=QPushButton('添加')
pbUpdate=QPushButton('修改')
pbDel=QPushButton('删除')
pbAdd.clicked.connect(self.addTreeNode)
pbUpdate.clicked.connect(self.updateTreeNode)
pbDel.clicked.connect(self.delTreeNode)
hLayBtn.addWidget(pbAdd)
hLayBtn.addWidget(pbUpdate)
hLayBtn.addWidget(pbDel)
(2)添加、删除和修改按钮关联对应其槽函数:
#添加节点
def addTreeNode(self):
item=self.tree.currentItem()
newNode=QTreeWidgetItem(item)
txt =self.le.text()
if txt != '':
newNode.setText(0, txt)
#更新节点
def updateTreeNode(self):
item=self.tree.currentItem()
txt =self.le.text()
if txt != '':
item.setText(0, txt)
#删除节点
def delTreeNode(self):
item=self.tree.currentItem()
root=self.tree.invisibleRootItem()
for item in self.tree.selectedItems():
(item.parent() or root).removeChild(item)