Python基础之用PyQt5写一个Tree Widget

Stella981
• 阅读 1038

Tree Widget这个空间类似于一种表格的形式,是一种树状结构

效果图:

Python基础之用PyQt5写一个Tree Widget

第一步:打开designer.exe,拖动一个Tree Widget空间到主窗口上

Python基础之用PyQt5写一个Tree Widget

第二步:双击Tree Widget,添加节点以及子节点

Python基础之用PyQt5写一个Tree Widget

Python基础之用PyQt5写一个Tree Widget

Python基础之用PyQt5写一个Tree Widget

Python基础之用PyQt5写一个Tree Widget

最后添加完后的图形为

Python基础之用PyQt5写一个Tree Widget

可以看到目前还没有什么效果,点击"Properties"我们给它换一下字体颜色和背景色。

首先选中Test1

Python基础之用PyQt5写一个Tree Widget

下滑右边的属性,找到"backgroud",设置Style为Solid,设置Color为想要的,点击右侧那三个点。可以看到颜色已经改变了,想要改变Value那一列某一行的颜色,选中Test1右侧的waiting,对背景色进行设置。另外,下面的foreground,是对字体颜色进行设置,设置方法差不多。

Python基础之用PyQt5写一个Tree Widget

Python基础之用PyQt5写一个Tree Widget

那么最后运行出来的效果就是:

Python基础之用PyQt5写一个Tree Widget

自己手动一项一项添加是不是很麻烦,用代码进行添加或许会容易许多,我们先来看看它UI转换成代码之后的py文件。

treeview3.py

Python基础之用PyQt5写一个Tree Widget Python基础之用PyQt5写一个Tree Widget

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'treeview3.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.treeWidget = QtWidgets.QTreeWidget(self.centralwidget)
        self.treeWidget.setGeometry(QtCore.QRect(200, 120, 256, 192))
        self.treeWidget.setObjectName("treeWidget")
        font = QtGui.QFont()
        font.setPointSize(14)
        self.treeWidget.headerItem().setFont(0, font)
        font = QtGui.QFont()
        font.setPointSize(14)
        self.treeWidget.headerItem().setFont(1, font)
        item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
        brush = QtGui.QBrush(QtGui.QColor(170, 0, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        item_0.setBackground(0, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 255, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        item_0.setBackground(1, brush)
        item_1 = QtWidgets.QTreeWidgetItem(item_0)
        item_1 = QtWidgets.QTreeWidgetItem(item_0)
        item_1 = QtWidgets.QTreeWidgetItem(item_0)
        item_1 = QtWidgets.QTreeWidgetItem(item_0)
        item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
        item_1 = QtWidgets.QTreeWidgetItem(item_0)
        item_1 = QtWidgets.QTreeWidgetItem(item_0)
        item_1 = QtWidgets.QTreeWidgetItem(item_0)
        item_1 = QtWidgets.QTreeWidgetItem(item_0)
        item_1 = QtWidgets.QTreeWidgetItem(item_0)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.treeWidget.headerItem().setText(0, _translate("MainWindow", "Key"))
        self.treeWidget.headerItem().setText(1, _translate("MainWindow", "Value"))
        __sortingEnabled = self.treeWidget.isSortingEnabled()
        self.treeWidget.setSortingEnabled(False)
        self.treeWidget.topLevelItem(0).setText(0, _translate("MainWindow", "Test1"))
        self.treeWidget.topLevelItem(0).setText(1, _translate("MainWindow", "waiting"))
        self.treeWidget.topLevelItem(0).child(0).setText(0, _translate("MainWindow", "a"))
        self.treeWidget.topLevelItem(0).child(0).setText(1, _translate("MainWindow", "waiting"))
        self.treeWidget.topLevelItem(0).child(1).setText(0, _translate("MainWindow", "b"))
        self.treeWidget.topLevelItem(0).child(1).setText(1, _translate("MainWindow", "waiting"))
        self.treeWidget.topLevelItem(0).child(2).setText(0, _translate("MainWindow", "c"))
        self.treeWidget.topLevelItem(0).child(2).setText(1, _translate("MainWindow", "waiting"))
        self.treeWidget.topLevelItem(0).child(3).setText(0, _translate("MainWindow", "d"))
        self.treeWidget.topLevelItem(0).child(3).setText(1, _translate("MainWindow", "waiting"))
        self.treeWidget.topLevelItem(1).setText(0, _translate("MainWindow", "Test2"))
        self.treeWidget.topLevelItem(1).setText(1, _translate("MainWindow", "waiting"))
        self.treeWidget.topLevelItem(1).child(0).setText(0, _translate("MainWindow", "a"))
        self.treeWidget.topLevelItem(1).child(0).setText(1, _translate("MainWindow", "waiting"))
        self.treeWidget.topLevelItem(1).child(1).setText(0, _translate("MainWindow", "b"))
        self.treeWidget.topLevelItem(1).child(1).setText(1, _translate("MainWindow", "waiting"))
        self.treeWidget.topLevelItem(1).child(2).setText(0, _translate("MainWindow", "c"))
        self.treeWidget.topLevelItem(1).child(2).setText(1, _translate("MainWindow", "waiting"))
        self.treeWidget.topLevelItem(1).child(3).setText(0, _translate("MainWindow", "d"))
        self.treeWidget.topLevelItem(1).child(3).setText(1, _translate("MainWindow", "waiting"))
        self.treeWidget.topLevelItem(1).child(4).setText(0, _translate("MainWindow", "e"))
        self.treeWidget.topLevelItem(1).child(4).setText(1, _translate("MainWindow", "waiting"))
        self.treeWidget.setSortingEnabled(__sortingEnabled)

View Code

动态添加数据

很多,不详看,那么我们只需要注意其中几条语句就可以。

第一个,设置颜色的语句块

1 item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
2 brush = QtGui.QBrush(QtGui.QColor(170, 0, 255))
3 brush.setStyle(QtCore.Qt.SolidPattern)
4 item_0.setBackground(0, brush)

其中item_0就是根节点

第二个,创建子节点的语句

item_1 = QtWidgets.QTreeWidgetItem(item_0)

第三个,设置每个节点的文本

1         self.treeWidget.topLevelItem(0).setText(0, _translate("MainWindow", "Test1"))
2         self.treeWidget.topLevelItem(0).setText(1, _translate("MainWindow", "waiting"))

topLevelItem(0)里面的0代表第一个根节点,setText(0, ....)里面的0代表第一列,1代表第二列。

1         self.treeWidget.topLevelItem(0).child(0).setText(0, _translate("MainWindow", "a"))
2         self.treeWidget.topLevelItem(0).child(0).setText(1, _translate("MainWindow", "waiting"))

child(0)里面的0代表第一个子节点

用界面添加的属于静态添加数据,并且一条一条的插入,修改样式很浪费时间,而且代码看起来也会比较多,如果动态插入的话会快许多。所以,想了一个办法,将要填入树结构的数据存放在一个类里面,类名为DataCollection。

treeview_data.py

Python基础之用PyQt5写一个Tree Widget Python基础之用PyQt5写一个Tree Widget

class DataCollection:
    def __init__(self):
        self.module = {}
        self.items = []

    def set_module(self, module_dic):
        self.module = module_dic

    def add_item(self, item_dic):
        self.items.append(item_dic)

    def set_item(self, item_dic, item_name):
        for item_num, item in enumerate(self.items):
            for name, result in item.items():
                if name == item_name:
                    self.items[item_num][name] = item_dic[name]
                    break
        all_pass = True
        for item1 in self.items:
            for result1 in item1.values():
                if result1 != "p":
                    all_pass = False
                    break
        if all_pass:
            for module_name, module_result in self.module.items():
                self.module[module_name] = "p"


if __name__ == "__main__":
    module_1 = DataCollection()
    module_1.set_module({"Test1": "t"})
    module_1.add_item({"a": "t"})
    module_1.add_item({"b": "t"})
    module_1.add_item({"c": "t"})
    module_1.add_item({"d": "t"})
    module_1.set_item({"a": "p"}, "a")
    module_1.set_item({"b": "p"}, "b")
    module_1.set_item({"c": "p"}, "c")
    module_1.set_item({"d": "p"}, "d")

View Code

然后修改刚才生成的treeview3.py

Python基础之用PyQt5写一个Tree Widget Python基础之用PyQt5写一个Tree Widget

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'treeview3.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets
import treeview_data


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.treeWidget = QtWidgets.QTreeWidget(self.centralwidget)
        self.treeWidget.setGeometry(QtCore.QRect(200, 120, 256, 192))
        self.treeWidget.setObjectName("treeWidget")
        font = QtGui.QFont()
        font.setPointSize(14)
        self.treeWidget.headerItem().setFont(0, font)
        font = QtGui.QFont()
        font.setPointSize(14)
        self.treeWidget.headerItem().setFont(1, font)
        # item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
        # brush = QtGui.QBrush(QtGui.QColor(170, 0, 255))
        # brush.setStyle(QtCore.Qt.SolidPattern)
        # item_0.setBackground(0, brush)
        # brush = QtGui.QBrush(QtGui.QColor(0, 255, 0))
        # brush.setStyle(QtCore.Qt.SolidPattern)
        # item_0.setBackground(1, brush)
        # item_1 = QtWidgets.QTreeWidgetItem(item_0)
        # item_1 = QtWidgets.QTreeWidgetItem(item_0)
        # item_1 = QtWidgets.QTreeWidgetItem(item_0)
        # item_1 = QtWidgets.QTreeWidgetItem(item_0)
        # item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
        # item_1 = QtWidgets.QTreeWidgetItem(item_0)
        # item_1 = QtWidgets.QTreeWidgetItem(item_0)
        # item_1 = QtWidgets.QTreeWidgetItem(item_0)
        # item_1 = QtWidgets.QTreeWidgetItem(item_0)
        # item_1 = QtWidgets.QTreeWidgetItem(item_0)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.treeWidget.headerItem().setText(0, _translate("MainWindow", "Key"))
        self.treeWidget.headerItem().setText(1, _translate("MainWindow", "Value"))
        __sortingEnabled = self.treeWidget.isSortingEnabled()
        self.treeWidget.setSortingEnabled(False)
        self.insert_data_to_tree_view(_translate)
        # self.treeWidget.topLevelItem(0).setText(0, _translate("MainWindow", "Test1"))
        # self.treeWidget.topLevelItem(0).setText(1, _translate("MainWindow", "waiting"))
        # self.treeWidget.topLevelItem(0).child(0).setText(0, _translate("MainWindow", "a"))
        # self.treeWidget.topLevelItem(0).child(0).setText(1, _translate("MainWindow", "waiting"))
        # self.treeWidget.topLevelItem(0).child(1).setText(0, _translate("MainWindow", "b"))
        # self.treeWidget.topLevelItem(0).child(1).setText(1, _translate("MainWindow", "waiting"))
        # self.treeWidget.topLevelItem(0).child(2).setText(0, _translate("MainWindow", "c"))
        # self.treeWidget.topLevelItem(0).child(2).setText(1, _translate("MainWindow", "waiting"))
        # self.treeWidget.topLevelItem(0).child(3).setText(0, _translate("MainWindow", "d"))
        # self.treeWidget.topLevelItem(0).child(3).setText(1, _translate("MainWindow", "waiting"))
        # self.treeWidget.topLevelItem(1).setText(0, _translate("MainWindow", "Test2"))
        # self.treeWidget.topLevelItem(1).setText(1, _translate("MainWindow", "waiting"))
        # self.treeWidget.topLevelItem(1).child(0).setText(0, _translate("MainWindow", "a"))
        # self.treeWidget.topLevelItem(1).child(0).setText(1, _translate("MainWindow", "waiting"))
        # self.treeWidget.topLevelItem(1).child(1).setText(0, _translate("MainWindow", "b"))
        # self.treeWidget.topLevelItem(1).child(1).setText(1, _translate("MainWindow", "waiting"))
        # self.treeWidget.topLevelItem(1).child(2).setText(0, _translate("MainWindow", "c"))
        # self.treeWidget.topLevelItem(1).child(2).setText(1, _translate("MainWindow", "waiting"))
        # self.treeWidget.topLevelItem(1).child(3).setText(0, _translate("MainWindow", "d"))
        # self.treeWidget.topLevelItem(1).child(3).setText(1, _translate("MainWindow", "waiting"))
        # self.treeWidget.topLevelItem(1).child(4).setText(0, _translate("MainWindow", "e"))
        # self.treeWidget.topLevelItem(1).child(4).setText(1, _translate("MainWindow", "waiting"))
        self.treeWidget.setSortingEnabled(__sortingEnabled)

    def insert_data_to_tree_view(self, _translate):
        list_objects = []
        test1 = treeview_data.DataCollection()
        test1.set_module({"Test1": "waiting"})
        test1.add_item({"a1": "waiting"})
        test1.add_item({"b1": "waiting"})
        test1.add_item({"c1": "waiting"})
        list_objects.append(test1)

        test2 = treeview_data.DataCollection()
        test2.set_module({"Test2": "waiting"})
        test2.add_item({"a2": "waiting"})
        test2.add_item({"b2": "waiting"})
        test2.add_item({"c2": "waiting"})
        test2.add_item({"d2": "waiting"})
        list_objects.append(test2)

        test3 = treeview_data.DataCollection()
        test3.set_module({"Test3": "waiting"})
        test3.add_item({"a2": "waiting"})
        test3.add_item({"b2": "waiting"})
        test3.add_item({"c2": "waiting"})
        test3.add_item({"d2": "waiting"})
        list_objects.append(test3)

        for object_num, object_module in enumerate(list_objects):
            item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
            brush = QtGui.QBrush(QtGui.QColor(176, 165, 172))
            brush.setStyle(QtCore.Qt.SolidPattern)
            item_0.setBackground(0, brush)
            for module_name, module_result in object_module.module.items():
                brush = QtGui.QBrush(QtGui.QColor(0, 255, 0))
                brush.setStyle(QtCore.Qt.SolidPattern)
                item_0.setBackground(1, brush)
                self.treeWidget.topLevelItem(object_num).setText(0, _translate("MainWindow", module_name))
                self.treeWidget.topLevelItem(object_num).setText(1, _translate("MainWindow", module_result))
            for item_num, item_dic in enumerate(object_module.items):
                for item_name, item_result in item_dic.items():
                    item_1 = QtWidgets.QTreeWidgetItem(item_0)
                    self.treeWidget.topLevelItem(object_num).child(item_num).setText(0, _translate("MainWindow", item_name))
                    self.treeWidget.topLevelItem(object_num).child(item_num).setText(1, _translate("MainWindow", item_result))

View Code

 如果想要使每次运行时,tree都是打开的状态,就在

self.insert_data_to_tree_view(_translate)

后面加一句

self.treeWidget.expandAll()

就行了。

最后的效果就是文章最开头的那样,在循环填写数据的时候,样式就已经设置了,很方便。可以看出,某些情况下画图比较方便,某些情况下代码比较快,具体看自己的需求是怎样的。

另外,如果大家还有什么好的存储数据的方法,欢迎分享交流。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这