激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - PyQt5 QTreeWidget 樹形結構遞歸遍歷當前所有節點的實現

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

2022-03-09 00:19庸了個白 Python

Qt中實現樹形結構可以使用QTreeWidget類,也可以使用QTreeView類,本文主要介紹了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 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 樹形結構遍歷內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_39177678/article/details/109179729

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 黄网站免费观看视频 | 小情侣嗯啊哦视频www | 欧美成人黄色小视频 | 亚洲精品在线观看免费 | 噜噜社 | 国产精品视频免费看 | 精品国产99久久久久久宅男i | 黄网站色成年大片免费高 | 草久影院 | 亚洲综合一区二区三区 | 日本成年免费网站 | 香蕉久草在线 | 午夜视频你懂的 | 久久狠狠高潮亚洲精品 | 久久久aa | 国产艳妇av视国产精选av一区 | 一区国产在线观看 | 蜜桃一本色道久久综合亚洲精品冫 | 国产视频在线观看一区二区三区 | 精品中文字幕视频 | 国产精品视频专区 | 一本一本久久a久久精品综合小说 | 成人在线视频黄色 | 成人性爱视频在线观看 | 国产精品视频成人 | 男人的天堂色偷偷 | 欧美一级性 | 91精品久久久久久久久 | 成年免费网站 | 99精品视频免费看 | 99精品视频在线导航 | 免费在线观看午夜视频 | 久久国产精 | 欧美一级毛片免费观看视频 | 国产无遮挡成人免费视频 | av电影在线播放 | 国产免费一区二区三区 | 亚洲天堂中文字幕在线观看 | 欧美日韩国产一区二区三区在线观看 | 娇妻被各种姿势c到高潮小说 | 亚洲精品成人在线视频 |