PyQt5 QTreeWidget 树形结构递归遍历当前所有节点的实现

目录
  • QTreeWidget类中的常用方法
  • QTreeWidgetItem类中的常用方法
  • 准备一个小demo
  • 这样的做法有什么好处和坏处?
  • 对比网上的方法

QTreeWidget类中的常用方法

方法 描述
setColumnWidth(int column,int width) 将指定列的宽度设置为给定的值width
insertTopLevelItems() 在视图的顶层索引中插入项目列表
expandAll() 展开所有的树形节点
invisibleRootItem() 返回树形控件中不可见的根选项
selectedItems() 返回所有选定的非隐藏项目的列表

QTreeWidgetItem类中的常用方法

方法 描述
addChild() 将子项追加到子列表中
setText() 设置显示的节点文本
Text() 返回显示的节点文本
setCheckState(column,state) 设置指定列的选中状态:Qt.Checked(节点选中),Qt.Unchecked(节点未选中)
setIcon(column,icon) 在指定的列中显示图标

准备一个小demo

常见小demo
简介:商品种类和商品的树形嵌套结构demo
功能:点击按键获取当前所有被选中的商品(夹带了一点私货〃‘▽'〃)
注意:篇幅有限,没有写子节点和父节点联动选中,所以在选择子节点时麻烦自行将父节点选上,不然会跳过。

代码块儿:

import sys
from PyQt5.QtWidgets import QTreeWidgetItem, QTreeWidget, QWidget, QVBoxLayout, QPushButton, QApplication
from PyQt5.QtCore import Qt

class Demo(QWidget):
    def __init__(self):
        super().__init__()
        # 实例化一个树形结构,隐藏了header
        self.tree = QTreeWidget()
        self.tree.setHeaderHidden(True)
        # 顶级分支
        self.tree_main = QTreeWidgetItem(self.tree)
        self.tree_main.setText(0, '商品种类')
        # 设置一些二级分支
        tree_second = ['电子产品', '水果', '日用品', '喜欢的人']
        self.gen_branch(self.tree_main, tree_second)
        # 设置一些三级分支
        tree_fruit = ['苹果', '香蕉', '梨']
        tree_daily_use = ['纸巾', '毛巾']
        tree_lovers = ['迪迪1号', '迪迪2号']
        # child(1) 意思是分支的第1个节点, 序号从0算起
        self.gen_branch(self.tree_main.child(1), tree_fruit)
        self.gen_branch(self.tree_main.child(2), tree_daily_use)
        self.gen_branch(self.tree_main.child(3), tree_lovers)
        # 一个按钮
        self.pushButton = QPushButton('选好了')
        # 显示出来
        self.qvl = QVBoxLayout()
        self.qvl.addWidget(self.tree)
        self.qvl.addWidget(self.pushButton)
        self.setLayout(self.qvl)

        # 绑定一下槽函数,传入主要的分支节点
        self.pushButton.clicked.connect(lambda: self.get_checked(self.tree_main))

    @staticmethod
    def gen_branch(node: QTreeWidgetItem, texts: list):
        """ 给定某个节点和列表 在该节点生成列表内分支"""
        for text in texts:
            item = QTreeWidgetItem()
            item.setText(0, text)
            item.setCheckState(0, Qt.Unchecked)
            node.addChild(item)

    def get_checked(self, node: QTreeWidgetItem)->list:
        """ 得到当前节点选中的所有分支, 返回一个 list """
        temp_list = []
        # 此处看下方注释 1
        for item in node.takeChildren():
            # 判断是否选中
            if item.checkState(0) == Qt.Checked:
                temp_list.append(item.text(0))
                # 判断是否还有子分支
                if item.childCount():
                    temp_list.extend(self.get_checked(item))
            node.addChild(item)
        print(temp_list)
        return temp_list

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Demo()
    win.show()
    sys.exit(app.exec_())

注释01:在这个函数中,我传入了一个 node 节点,takeChildren() 这个方法会将该node节点的所有一级子分支拿出来(删除),并返回节点的所有一级分支的列表,如下所示。该方法只能返回一级的节点信息,利用 childCount() 来判断是否有子分支,有则递归,一直到最底部的节点。因为在获取的时候 takeChildren() 删除了所有节点,所以在操作结束后重新加入到 node 节点中

[
<PyQt5.QtWidgets.QTreeWidgetItem object at 0x0000000008464708>,
<PyQt5.QtWidgets.QTreeWidgetItem object at 0x0000000008464798>,
]

这样的做法有什么好处和坏处?

最大的好处无疑是不需要创建额外的变量去存储子节点的信息,子节点的信息和顺序都是实时获取的而非前期就定好了的。坏处,我设想这个方法用多了可能会存在节点顺序改变的情况。比如“苹果、香蕉”变成了“香蕉、苹果”,目前未出现。

对比网上的方法

有一个关于 QTreeWidgetItemIterator 的办法,这是Qt中自带的遍历器,大概如下

item = QtWidgets.QTreeWidgetItemIterator(self.treeWidget),

用 item.value() 来定位到一个节点,item.value() 的实例就是上文列表中的那种对象,个人感觉差不太多。

还有一种比较暴力做法。在生成子节点的时候将所有子节点放到当前类的作用域中,也就是作为属性存在。

self.item1 = QTreeWidgetItem()

或是生成的时候保存在一个定义在作用域的列表中,这么做有一个坏处,节点的信息都是提前定好了的。但实际上遇到的情况更多应该是未知的。

self.item_list = []
self.item_list.append([... ... ]) 

到此这篇关于PyQt5 QTreeWidget 树形结构递归遍历当前所有节点的实现的文章就介绍到这了,更多相关PyQt5 QTreeWidget 树形结构遍历内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例

    PyQt5树形结构控件QTreeWidget简介 QTreeWidget 类根据预设的模型提供树形显示控件. QTreeWidget 使用类似于 QListView 类的方式提供一种典型的基于 item 的树形交互方法类,该类基于QT的"模型/视图"结构,提供了默认的模型来支撑 item 的显示,这些 item 类为 QTreeWidgetItem 类. 如果不需要灵活的"模型/视图"框架,可以使用QTreeWidget 来创建有层级关系的树形结构.当把标准 ite

  • PyQt5 QTreeWidget 树形结构递归遍历当前所有节点的实现

    目录 QTreeWidget类中的常用方法 QTreeWidgetItem类中的常用方法 准备一个小demo 这样的做法有什么好处和坏处? 对比网上的方法 QTreeWidget类中的常用方法 方法 描述 setColumnWidth(int column,int width) 将指定列的宽度设置为给定的值width insertTopLevelItems() 在视图的顶层索引中插入项目列表 expandAll() 展开所有的树形节点 invisibleRootItem() 返回树形控件中不可见

  • Qt QTreeWidget 树形结构实现代码

    Qt中实现树形结构可以使用QTreeWidget类,也可以使用QTreeView类,QTreeWidget继承自QTreeView类.树形效果如下图所示: 这是怎么实现的呢?还有点击节点时会有相应的事件响应. 1. 树形结构实现 QT GUI中有treeWidget部件,将该控件在Gui中布局好,假设其对象名为treeWidget. QTreeWidget类官方文档:http://qt-project.org/doc/qt-4.8/qtreewidget.html 树形结构通过QTreeWidg

  • 浅谈JavaScript构造树形结构的一种高效算法

    引言 我们经常会碰到树形数据结构,比如组织层级.省市县或者动植物分类等等数据.下面是一个树形结构的例子: 在实际应用中,比较常见的做法是将这些信息存储为下面的结构,特别是当存在1对多的父/子节点关系时: const data = [ { id: 56, parentId: 62 }, { id: 81, parentId: 80 }, { id: 74, parentId: null }, { id: 76, parentId: 80 }, { id: 63, parentId: 62 }, {

  • 树形结构数据库表Schema设计的两种方案

    目录 前言 一.基本数据 二.继承关系驱动的Schema设计 三.基于左右值编码的Schema设计 四.树形结构CRUD算法 (1)获取某节点的子孙节点 (2)获取某节点的族谱路径 (3)为某节点添加子孙节点 (4)删除某节点 五.总结 前言 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完成持久化.然而目前的各种基于关系的数据库,都是以二维表的形式记录存储数据信息,因此是不能直接将Tree存入DBMS

  • Mysql树形结构的数据库表设计方案

    目录 前言 一.基本数据 二.继承关系驱动的设计 三.基于左右值编码的设计 四.树形结构CRUD算法 (1)获取某节点的子孙节点 (2)获取某节点的族谱路径 (3)为某节点添加子孙节点 (4)删除某节点 五.总结 参考文献 前言 最近研究树形菜单网上找了很多例子看了.一下是网上找的一些资料,然后自己重新实践,记录下免得下次又忘记了. 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完成持久化.然而目前的各

  • Java递归遍历树形结构

    废话不多说了,直接给大家贴代码,具体代码如下所示: //菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray childMenu = new JSONArray(); for (Object object : menuList) { JSONObject jsonMenu = JSONObject.fromObject(object); int menuId = jsonMenu.ge

  • Java递归遍历树形结构的实现代码

    废话不多说了,直接给大家贴代码,具体代码如下所示: //菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray childMenu = new JSONArray(); for (Object object : menuList) { JSONObject jsonMenu = JSONObject.fromObject(object); int menuId = jsonMenu.ge

  • java、js中实现无限层级的树形结构方法(类似递归)

    js中: var zNodes=[ {id:0,pId:-1,name:"Aaaa"}, {id:1,pId:0,name:"A"}, {id:11,pId:1,name:"A1"}, {id:12,pId:1,name:"A2"}, {id:13,pId:1,name:"A3"}, {id:2,pId:0,name:"B"}, {id:21,pId:2,name:"B1&qu

  • Java遍历输出指定目录、树形结构所有文件包括子目录下的文件

    下面通过一段代码介绍下Java输出指定目录.树形结构下的所有文件包括子目录中的文件的方法,并附有效果图. import java.io.File; public class ReadDirectory { // 文件所在的层数 private int fileLevel; /** * 生成输出格式 * @param name 输出的文件名或目录名 * @param level 输出的文件名或者目录名所在的层次 * @return 输出的字符串 */ public String createPri

随机推荐