广告
返回顶部
首页 > 资讯 > 精选 >PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么
  • 295
分享到

PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么

2023-06-21 21:06:33 295人浏览 八月长安
摘要

这篇文章主要介绍“PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么”,在日常操作中,相信很多人在PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么问题上存在疑惑,

这篇文章主要介绍“PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么”,在日常操作中,相信很多人在PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

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
功能:点击按键获取当前所有被选中的商品(夹带了一点私货〃‘▽'〃)
注意:篇幅有限,没有写子节点和父节点联动选中,所以在选择子节点时麻烦自行将父节点选上,不然会跳过。

PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么

PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么

代码块儿:

import sysfrom PyQt5.QtWidgets import QTreeWidgetItem, QTreeWidget, QWidget, QVBoxLayout, QPushButton, QApplicationfrom PyQt5.QtCore import Qtclass 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_listif __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树形结构递归遍历当前所有节点的实现方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: PyQt5 QTreeWidget树形结构递归遍历当前所有节点的实现方法是什么

本文链接: https://www.lsjlt.com/news/300727.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作