入门 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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.

思路如下:

(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)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

(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)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
本文至此结束,喜欢点赞关注,您的关注和点赞是路卿进步的动力哦!老Baby们!!!