第二十七篇 -- QTreeWidget總結


前言

之前寫過幾篇關於TreeWidget的文章,不過不方便查閱,特此重新整合作為總結。不過關於QtDesigner畫圖,還是不重新寫了,看 第一篇 就OK。

准備工作

1. 用QtDesigner畫一個QTreeWidget

2. 自己事先確定好層次與列的類型。

QtreeWidget的展開層次類定義。

# 節點類型的枚舉類型
class TreeItemType(Enum):
    itGroupItem = 1001  # 群組
    itMemberItem = 1002  # 成員
View Code

 

 

QTreeWidget列類型類定義。

class TreeColNum(Enum):  # 目錄樹的列號的枚舉類型
    col_item_group = 0  #
    col_item_name = 1  # 姓名
    col_item_sex = 2   # 性別
    col_item_score = 3   # 分數
    col_item_excellent = 4   # 優秀
View Code

 

根據上述定義,此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)))
View Code

 

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_())
View Code

 

只是為實現各種樣式而寫,並無要求美觀實用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM