您好,登錄后才能下訂單哦!
這篇文章主要介紹“PyQt5 QTreeWidget樹形結(jié)構(gòu)遞歸遍歷當(dāng)前所有節(jié)點的實現(xiàn)方法是什么”,在日常操作中,相信很多人在PyQt5 QTreeWidget樹形結(jié)構(gòu)遞歸遍歷當(dāng)前所有節(jié)點的實現(xiàn)方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PyQt5 QTreeWidget樹形結(jié)構(gòu)遞歸遍歷當(dāng)前所有節(jié)點的實現(xiàn)方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
方法 | 描述 |
---|---|
setColumnWidth(int column,int width) | 將指定列的寬度設(shè)置為給定的值width |
insertTopLevelItems() | 在視圖的頂層索引中插入項目列表 |
expandAll() | 展開所有的樹形節(jié)點 |
invisibleRootItem() | 返回樹形控件中不可見的根選項 |
selectedItems() | 返回所有選定的非隱藏項目的列表 |
方法 | 描述 |
---|---|
addChild() | 將子項追加到子列表中 |
setText() | 設(shè)置顯示的節(jié)點文本 |
Text() | 返回顯示的節(jié)點文本 |
setCheckState(column,state) | 設(shè)置指定列的選中狀態(tài):Qt.Checked(節(jié)點選中),Qt.Unchecked(節(jié)點未選中) |
setIcon(column,icon) | 在指定的列中顯示圖標(biāo) |
常見小demo
簡介:商品種類和商品的樹形嵌套結(jié)構(gòu)demo
功能:點擊按鍵獲取當(dāng)前所有被選中的商品(夾帶了一點私貨〃‘▽'〃)
注意:篇幅有限,沒有寫子節(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__() # 實例化一個樹形結(jié)構(gòu),隱藏了header self.tree = QTreeWidget() self.tree.setHeaderHidden(True) # 頂級分支 self.tree_main = QTreeWidgetItem(self.tree) self.tree_main.setText(0, '商品種類') # 設(shè)置一些二級分支 tree_second = ['電子產(chǎn)品', '水果', '日用品', '喜歡的人'] self.gen_branch(self.tree_main, tree_second) # 設(shè)置一些三級分支 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) # 綁定一下槽函數(shù),傳入主要的分支節(jié)點 self.pushButton.clicked.connect(lambda: self.get_checked(self.tree_main)) @staticmethod def gen_branch(node: QTreeWidgetItem, texts: list): """ 給定某個節(jié)點和列表 在該節(jié)點生成列表內(nèi)分支""" 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: """ 得到當(dāng)前節(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:在這個函數(shù)中,我傳入了一個 node 節(jié)點,takeChildren() 這個方法會將該node節(jié)點的所有一級子分支拿出來(刪除),并返回節(jié)點的所有一級分支的列表,如下所示。該方法只能返回一級的節(jié)點信息,利用 childCount() 來判斷是否有子分支,有則遞歸,一直到最底部的節(jié)點。因為在獲取的時候 takeChildren() 刪除了所有節(jié)點,所以在操作結(jié)束后重新加入到 node 節(jié)點中
[ <PyQt5.QtWidgets.QTreeWidgetItem object at 0x0000000008464708>, <PyQt5.QtWidgets.QTreeWidgetItem object at 0x0000000008464798>, ]
最大的好處無疑是不需要創(chuàng)建額外的變量去存儲子節(jié)點的信息,子節(jié)點的信息和順序都是實時獲取的而非前期就定好了的。壞處,我設(shè)想這個方法用多了可能會存在節(jié)點順序改變的情況。比如“蘋果、香蕉”變成了“香蕉、蘋果”,目前未出現(xiàn)。
有一個關(guān)于 QTreeWidgetItemIterator 的辦法,這是Qt中自帶的遍歷器,大概如下
item = QtWidgets.QTreeWidgetItemIterator(self.treeWidget),
用 item.value() 來定位到一個節(jié)點,item.value() 的實例就是上文列表中的那種對象,個人感覺差不太多。
還有一種比較暴力做法。在生成子節(jié)點的時候?qū)⑺凶庸?jié)點放到當(dāng)前類的作用域中,也就是作為屬性存在。
self.item1 = QTreeWidgetItem()
或是生成的時候保存在一個定義在作用域的列表中,這么做有一個壞處,節(jié)點的信息都是提前定好了的。但實際上遇到的情況更多應(yīng)該是未知的。
self.item_list = [] self.item_list.append([... ... ])
到此,關(guān)于“PyQt5 QTreeWidget樹形結(jié)構(gòu)遞歸遍歷當(dāng)前所有節(jié)點的實現(xiàn)方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。