第二十七篇 -- QTreeWidget总结
阅读原文时间:2023年07月10日阅读:1

之前写过几篇关于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列。

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)

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

只是为实现各种样式而写,并无要求美观实用。