入门 PyQt6 看过来(案例)20~ 动态树

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)


本文至此结束,喜欢点赞关注,您的关注和点赞是路卿进步的动力哦!老Baby们!!!

  • 21
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路卿老师

大哥大姐给点吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值