zoukankan      html  css  js  c++  java
  • 第二十七篇 -- 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

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

  • 相关阅读:
    我这样来解决CSS的Bug
    JavaScript 获取客户端计算机硬件及系统信息
    asp.net Excel导入&导出
    C#编码好习惯
    解决ASP.NET“类型初始值设定项引发异常”
    使cookie在关闭浏览器后失效
    C# 实现Epson热敏打印机打印 Pos机用
    设计模式的主要设计原则简介
    string .format 生成类似20090409001的序号
    SEO中链接的微处理
  • 原文地址:https://www.cnblogs.com/smart-zihan/p/13036150.html
Copyright © 2011-2022 走看看