前言
之前寫過幾篇關於TreeWidget的文章,不過不方便查閱,特此重新整合作為總結。不過關於QtDesigner畫圖,還是不重新寫了,看 第一篇 就OK。
准備工作
1. 用QtDesigner畫一個QTreeWidget
2. 自己事先確定好層次與列的類型。
QtreeWidget的展開層次類定義。

# 節點類型的枚舉類型 class TreeItemType(Enum): itGroupItem = 1001 # 群組 itMemberItem = 1002 # 成員
QTreeWidget列類型類定義。

class TreeColNum(Enum): # 目錄樹的列號的枚舉類型 col_item_group = 0 # 組 col_item_name = 1 # 姓名 col_item_sex = 2 # 性別 col_item_score = 3 # 分數 col_item_excellent = 4 # 優秀
根據上述定義,此QTreeWidget有兩層節點,有5列。
QTreeWidget樣式的基本方法
1. 設置表頭
# 設置表頭 self.ui.treeWidget.setHeaderLabels(['Group', 'Name', 'Sex', 'Score', 'Excellent'])
2. 設置表頭背景色
# 設置表頭顏色 self.ui.treeWidget.setStyleSheet("QHeaderView::section{background:rgb(85, 181, 200);}")
3. 設置表頭前景色
# 設置表頭前景色 brush = QBrush(QColor(255, 240, 0)) brush.setStyle(Qt.SolidPattern) self.ui.treeWidget.headerItem().setForeground(0, brush)
4. 隱藏某列
# 隱藏某一列 self.ui.treeWidget.hideColumn(TreeColNum.col_item_excellent.value)
5. 設置列寬
# 設置列寬 self.ui.treeWidget.setColumnWidth(1, 150) # 第1列寬150
6. 清除QtreeWidget數據
self.ui.treeWidget.clear()
7. 添加根節點
# 定義一個節點類型 item = QTreeWidgetItem(TreeItemType.itGroupItem.value) # 設置節點的列對應的文本,此例為在group列寫入數據group0,1,2,3... item.setText(TreeColNum.col_item_group.value, "Group" + str(i)) # 將節點添加進QTreeWidget self.ui.treeWidget.addTopLevelItem(item)
8. 添加子節點
# 定義節點類型 item_member = QTreeWidgetItem(TreeItemType.itMemberItem.value) # 設置節點列的文本 item_member.setText(TreeColNum.col_item_group.value, str(j)) # 將節點添加到父節點 item.addChild(item_member) # 設置節點展開 item.setExpanded(True)
9. 設置表頭字體大小
font = QFont() font.setPointSize(14) # 表頭第一列字體大小為14 self.ui.treeWidget.headerItem().setFont(1, font)
10. 設置節點字體大小
font = QFont() font.setPointSize(14) # 設置此item的第0列字體大小為14 item.setFont(0, font)
11. 設置節點字體顏色
# 設置節點顏色 brush = QBrush(QColor(210, 80, 234)) brush.setStyle(Qt.SolidPattern) item.setForeground(0, brush)
12. 設置節點字體背景色
# 設置背景色 item.setBackground(1, brush)
13. 定位設置背景色
# 第1個根節點的第二列設置為紅色 brush = QBrush(QColor(255, 0, 0)) # 紅色 brush.setStyle(Qt.SolidPattern) self.ui.treeWidget.topLevelItem(1).setBackground(2, brush) # 第0個根節點的的第1個子節點的第2列設置為黃色 brush = QBrush(QColor(255, 255, 0)) # 黃色 brush.setStyle(Qt.SolidPattern) self.ui.treeWidget.topLevelItem(0).child(1).setBackground(2, brush)
QTreeWidget操作的基本方法
1. 設置滾輪定位
# 設置滾輪到第5個節點的第二個子節點位置 child_item = self.ui.treeWidget.topLevelItem(5).child(2) self.ui.treeWidget.scrollToItem(child_item)
2. 設定綁定事件,當TreeWidget被單擊時,執行綁定函數
綁定事件
# 設置綁定事件 self.ui.treeWidget.clicked.connect(self.onTreeClicked)
綁定函數

def onTreeClicked(self, qmodelindex): item = self.ui.treeWidget.currentItem() # 獲取父節點 parent = item.parent() index_row = -1 if parent is None: # 獲取當前節點的序號 index_top = self.ui.treeWidget.indexOfTopLevelItem(item) print("當前在根節點Group" + str(index_top)) else: # 獲取父節點的序號 index_top = self.ui.treeWidget.indexOfTopLevelItem(parent) print("當前在父節點Group" + str(index_top), end="") # 獲取當前節點的序號 index_row = parent.indexOfChild(item) print("下的" + str(index_row) + "號子節點", end="") # 打印當前行的內容 print("Group=%s ,Name=%s, Sex=%s, Score=%s" % (item.text(0), item.text(1), item.text(2), item.text(3)))
item = self.treeWidget.currentItem是獲取當前選中行
這個綁定函數是針對有兩層節點而言的。index_top是第一層節點的序號,index_row是當前節點的序號。
這部分獲取當前行的樹節點的層次,如果需要獲取當前行的內容,item.text(0)表示當前行第0列的內容。
比如:
Group5的第0個子節點: item.text(0) = "0",item.text(1) = "Alisa0", item.text(2) = "girl"
如果想要獲取父節點的文本,同理,parent.text(0), parent.text(1),......
源碼

#!/usr/bin/env python # _*_ coding: UTF-8 _*_ """================================================= @Project -> File : six-dialog_design -> myUI_treewidget.py @IDE : PyCharm @Author : zihan @Date : 2020/6/3 8:51 @Desc :QTreeWidget的基本樣式方法 =================================================""" import sys from PyQt5.QtWidgets import QApplication, QWidget, QTreeWidgetItem from PyQt5.QtGui import QFont, QBrush, QColor from PyQt5.QtCore import Qt from ui_treewidget import Ui_Form from enum import Enum # 節點類型的枚舉類型 class TreeItemType(Enum): itGroupItem = 1001 # 群組 itMemberItem = 1002 # 成員 class TreeColNum(Enum): # 目錄樹的列號的枚舉類型 col_item_group = 0 # 組 col_item_name = 1 # 姓名 col_item_sex = 2 # 性別 col_item_score = 3 # 分數 col_item_excellent = 4 # 優秀 class QmyWidget(QWidget): def __init__(self, parent=None): super().__init__(parent) # 調用父類構造函數 self.ui = Ui_Form() # 創建UI對象 self.ui.setupUi(self) # 構造UI self.initial_tree() # 設置綁定事件 self.ui.treeWidget.clicked.connect(self.onTreeClicked) def onTreeClicked(self, qmodelindex): item = self.ui.treeWidget.currentItem() # 獲取父節點 parent = item.parent() index_row = -1 if parent is None: # 獲取當前節點的序號 index_top = self.ui.treeWidget.indexOfTopLevelItem(item) print("當前在根節點Group" + str(index_top)) else: # 獲取父節點的序號 index_top = self.ui.treeWidget.indexOfTopLevelItem(parent) print("當前在父節點Group" + str(index_top), end="") # 獲取當前節點的序號 index_row = parent.indexOfChild(item) print("下的" + str(index_row) + "號子節點", end="") # 打印當前行的內容 print("Group=%s ,Name=%s, Sex=%s, Score=%s" % (item.text(0), item.text(1), item.text(2), item.text(3))) def initial_tree(self): # 設置表頭 self.ui.treeWidget.setHeaderLabels(['Group', 'Name', 'Sex', 'Score', 'Excellent']) # 設置表頭背景色 self.ui.treeWidget.setStyleSheet("QHeaderView::section{background:rgb(85, 181, 200);}") # 設置表頭前景色 brush = QBrush(QColor(255, 240, 0)) brush.setStyle(Qt.SolidPattern) self.ui.treeWidget.headerItem().setForeground(0, brush) # 隱藏某一列 self.ui.treeWidget.hideColumn(TreeColNum.col_item_excellent.value) # 設置列寬 self.ui.treeWidget.setColumnWidth(1, 150) # 第1列寬150 # 假設QTreeWidget第一層的節點有10個 for i in range(10): # 定義一個節點類型 item = QTreeWidgetItem(TreeItemType.itGroupItem.value) # 設置節點的列對應的文本,此例為在group列寫入數據group0,1,2,3... item.setText(TreeColNum.col_item_group.value, "Group" + str(i)) # 設置根節點字體大小 font = QFont() font.setPointSize(14) item.setFont(0, font) # 設置節點顏色 brush = QBrush(QColor(210, 80, 234)) brush.setStyle(Qt.SolidPattern) # 設置前景色 item.setForeground(0, brush) # 設置背景色 item.setBackground(1, brush) # 將節點添加進QTreeWidget self.ui.treeWidget.addTopLevelItem(item) # 假設QTreeWidget第二層的節點有3個 for j in range(3): item_member = QTreeWidgetItem(TreeItemType.itMemberItem.value) item_member.setText(TreeColNum.col_item_group.value, str(j)) item_member.setText(TreeColNum.col_item_name.value, "Alisa" + str(j)) if j % 2 == 0: item_member.setText(TreeColNum.col_item_sex.value, "girl") item_member.setText(TreeColNum.col_item_score.value, "99") item_member.setText(TreeColNum.col_item_excellent.value, "True") else: item_member.setText(TreeColNum.col_item_sex.value, "boy") item_member.setText(TreeColNum.col_item_score.value, "50") item_member.setText(TreeColNum.col_item_excellent.value, "False") item.addChild(item_member) item.setExpanded(True) # 設置節點展開 font = QFont() font.setPointSize(14) self.ui.treeWidget.headerItem().setFont(0, font) # 第1個根節點的第二列設置為紅色 brush = QBrush(QColor(255, 0, 0)) # 紅色 brush.setStyle(Qt.SolidPattern) self.ui.treeWidget.topLevelItem(1).setBackground(2, brush) # 第0個根節點的的第1個子節點的第2列設置為黃色 brush = QBrush(QColor(255, 255, 0)) # 黃色 brush.setStyle(Qt.SolidPattern) self.ui.treeWidget.topLevelItem(0).child(1).setBackground(2, brush) # 設置右側滾輪到指定位置 child_item = self.ui.treeWidget.topLevelItem(5).child(2) self.ui.treeWidget.scrollToItem(child_item) if __name__ == '__main__': app = QApplication(sys.argv) # 創建app form = QmyWidget() form.show() sys.exit(app.exec_())
只是為實現各種樣式而寫,並無要求美觀實用。