欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PyQt5 QTreeWidget 樹形結構遞歸遍歷當前所有節(jié)點的實現

 更新時間:2021年11月28日 10:55:48   作者:庸了個白  
Qt中實現樹形結構可以使用QTreeWidget類,也可以使用QTreeView類,本文主要介紹了PyQt5 QTreeWidget 樹形結構遞歸遍歷當前所有節(jié)點的實現,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

QTreeWidget類中的常用方法

方法 描述
setColumnWidth(int column,int width) 將指定列的寬度設置為給定的值width
insertTopLevelItems() 在視圖的頂層索引中插入項目列表
expandAll() 展開所有的樹形節(jié)點
invisibleRootItem() 返回樹形控件中不可見的根選項
selectedItems() 返回所有選定的非隱藏項目的列表

QTreeWidgetItem類中的常用方法

方法 描述
addChild() 將子項追加到子列表中
setText() 設置顯示的節(jié)點文本
Text() 返回顯示的節(jié)點文本
setCheckState(column,state) 設置指定列的選中狀態(tài):Qt.Checked(節(jié)點選中),Qt.Unchecked(節(jié)點未選中)
setIcon(column,icon) 在指定的列中顯示圖標

準備一個小demo

常見小demo
簡介:商品種類和商品的樹形嵌套結構demo
功能:點擊按鍵獲取當前所有被選中的商品(夾帶了一點私貨〃‘▽'〃)
注意:篇幅有限,沒有寫子節(jié)點和父節(jié)點聯(lián)動選中,所以在選擇子節(jié)點時麻煩自行將父節(jié)點選上,不然會跳過。

在這里插入圖片描述

在這里插入圖片描述

代碼塊兒:

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個節(jié)點, 序號從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)

        # 綁定一下槽函數,傳入主要的分支節(jié)點
        self.pushButton.clicked.connect(lambda: self.get_checked(self.tree_main))

    @staticmethod
    def gen_branch(node: QTreeWidgetItem, texts: list):
        """ 給定某個節(jié)點和列表 在該節(jié)點生成列表內分支"""
        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:
        """ 得到當前節(jié)點選中的所有分支, 返回一個 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 節(jié)點,takeChildren() 這個方法會將該node節(jié)點的所有一級子分支拿出來(刪除),并返回節(jié)點的所有一級分支的列表,如下所示。該方法只能返回一級的節(jié)點信息,利用 childCount() 來判斷是否有子分支,有則遞歸,一直到最底部的節(jié)點。因為在獲取的時候 takeChildren() 刪除了所有節(jié)點,所以在操作結束后重新加入到 node 節(jié)點中

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

這樣的做法有什么好處和壞處?

最大的好處無疑是不需要創(chuàng)建額外的變量去存儲子節(jié)點的信息,子節(jié)點的信息和順序都是實時獲取的而非前期就定好了的。壞處,我設想這個方法用多了可能會存在節(jié)點順序改變的情況。比如“蘋果、香蕉”變成了“香蕉、蘋果”,目前未出現。

對比網上的方法

有一個關于 QTreeWidgetItemIterator 的辦法,這是Qt中自帶的遍歷器,大概如下

item = QtWidgets.QTreeWidgetItemIterator(self.treeWidget),

用 item.value() 來定位到一個節(jié)點,item.value() 的實例就是上文列表中的那種對象,個人感覺差不太多。

還有一種比較暴力做法。在生成子節(jié)點的時候將所有子節(jié)點放到當前類的作用域中,也就是作為屬性存在。

self.item1 = QTreeWidgetItem()

或是生成的時候保存在一個定義在作用域的列表中,這么做有一個壞處,節(jié)點的信息都是提前定好了的。但實際上遇到的情況更多應該是未知的。

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

到此這篇關于PyQt5 QTreeWidget 樹形結構遞歸遍歷當前所有節(jié)點的實現的文章就介紹到這了,更多相關PyQt5 QTreeWidget 樹形結構遍歷內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python3+PyQt5 自定義窗口部件--使用窗口部件樣式表的方法

    python3+PyQt5 自定義窗口部件--使用窗口部件樣式表的方法

    今天小編就為大家分享一篇python3+PyQt5 自定義窗口部件--使用窗口部件樣式表的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 解決springboot yml配置 logging.level 報錯問題

    解決springboot yml配置 logging.level 報錯問題

    今天小編就為大家分享一篇解決springboot yml配置 logging.level 報錯問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Django框架實現的簡單分頁功能示例

    Django框架實現的簡單分頁功能示例

    這篇文章主要介紹了Django框架實現的簡單分頁功能,在之前一篇留言板之上增加了簡單分頁功能,涉及Paginator模塊的簡單使用技巧,需要的朋友可以參考下
    2018-12-12
  • python中pytest收集用例規(guī)則與運行指定用例詳解

    python中pytest收集用例規(guī)則與運行指定用例詳解

    這篇文章主要介紹了python中pytest收集用例規(guī)則與運行指定用例詳解,天會講解一下pytest是如何收集我們寫好的用例?我們又有哪些方式來運行單個用例或者批量運行用例呢,需要的朋友可以參考下
    2019-06-06
  • python類繼承與子類實例初始化用法分析

    python類繼承與子類實例初始化用法分析

    這篇文章主要介紹了python類繼承與子類實例初始化用法,實例分析了Python類的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • python twilio模塊實現發(fā)送手機短信功能

    python twilio模塊實現發(fā)送手機短信功能

    這篇文章主要介紹了python twilio模塊實現發(fā)送手機短信的功能,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • python字典排序淺析介紹

    python字典排序淺析介紹

    在數據處理時,為了方便統(tǒng)計經常使用字典存儲數據。python中的字典是‘鍵:值’對的可變序列。排序時可以指定根據鍵或者是值為對象進行排序。用到的函數是sorted(),需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • pytest進階教程之fixture函數詳解

    pytest進階教程之fixture函數詳解

    這篇文章主要給大家介紹了關于pytest進階教程之fixture函數的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • python讀取txt文件并取其某一列數據的示例

    python讀取txt文件并取其某一列數據的示例

    今天小編就為大家分享一篇python讀取txt文件并取其某一列數據的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Python dict的使用誤區(qū)你知道嗎

    Python dict的使用誤區(qū)你知道嗎

    這篇文章主要為大家介紹了Python dict的使用誤區(qū),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評論