Python基础之用PyQt5写一个Tree Widget

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

效果图:

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

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

最后添加完后的图形为

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

首先选中Test1

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

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

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

treeview3.py

1# -*- coding: utf-8 -*- 2 3# Form implementation generated from reading ui file 'treeview3.ui' 4# 5# Created by: PyQt5 UI code generator 5.13.0 6# 7# WARNING! All changes made in this file will be lost! 8 9 10from PyQt5 import QtCore, QtGui, QtWidgets 11 12 13class Ui_MainWindow(object): 14 def setupUi(self, MainWindow): 15 MainWindow.setObjectName("MainWindow") 16 MainWindow.resize(800, 600) 17 self.centralwidget = QtWidgets.QWidget(MainWindow) 18 self.centralwidget.setObjectName("centralwidget") 19 self.treeWidget = QtWidgets.QTreeWidget(self.centralwidget) 20 self.treeWidget.setGeometry(QtCore.QRect(200, 120, 256, 192)) 21 self.treeWidget.setObjectName("treeWidget") 22 font = QtGui.QFont() 23 font.setPointSize(14) 24 self.treeWidget.headerItem().setFont(0, font) 25 font = QtGui.QFont() 26 font.setPointSize(14) 27 self.treeWidget.headerItem().setFont(1, font) 28 item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) 29 brush = QtGui.QBrush(QtGui.QColor(170, 0, 255)) 30 brush.setStyle(QtCore.Qt.SolidPattern) 31 item_0.setBackground(0, brush) 32 brush = QtGui.QBrush(QtGui.QColor(0, 255, 0)) 33 brush.setStyle(QtCore.Qt.SolidPattern) 34 item_0.setBackground(1, brush) 35 item_1 = QtWidgets.QTreeWidgetItem(item_0) 36 item_1 = QtWidgets.QTreeWidgetItem(item_0) 37 item_1 = QtWidgets.QTreeWidgetItem(item_0) 38 item_1 = QtWidgets.QTreeWidgetItem(item_0) 39 item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) 40 item_1 = QtWidgets.QTreeWidgetItem(item_0) 41 item_1 = QtWidgets.QTreeWidgetItem(item_0) 42 item_1 = QtWidgets.QTreeWidgetItem(item_0) 43 item_1 = QtWidgets.QTreeWidgetItem(item_0) 44 item_1 = QtWidgets.QTreeWidgetItem(item_0) 45 MainWindow.setCentralWidget(self.centralwidget) 46 self.menubar = QtWidgets.QMenuBar(MainWindow) 47 self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21)) 48 self.menubar.setObjectName("menubar") 49 MainWindow.setMenuBar(self.menubar) 50 self.statusbar = QtWidgets.QStatusBar(MainWindow) 51 self.statusbar.setObjectName("statusbar") 52 MainWindow.setStatusBar(self.statusbar) 53 54 self.retranslateUi(MainWindow) 55 QtCore.QMetaObject.connectSlotsByName(MainWindow) 56 57 def retranslateUi(self, MainWindow): 58 _translate = QtCore.QCoreApplication.translate 59 MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 60 self.treeWidget.headerItem().setText(0, _translate("MainWindow", "Key")) 61 self.treeWidget.headerItem().setText(1, _translate("MainWindow", "Value")) 62 __sortingEnabled = self.treeWidget.isSortingEnabled() 63 self.treeWidget.setSortingEnabled(False) 64 self.treeWidget.topLevelItem(0).setText(0, _translate("MainWindow", "Test1")) 65 self.treeWidget.topLevelItem(0).setText(1, _translate("MainWindow", "waiting")) 66 self.treeWidget.topLevelItem(0).child(0).setText(0, _translate("MainWindow", "a")) 67 self.treeWidget.topLevelItem(0).child(0).setText(1, _translate("MainWindow", "waiting")) 68 self.treeWidget.topLevelItem(0).child(1).setText(0, _translate("MainWindow", "b")) 69 self.treeWidget.topLevelItem(0).child(1).setText(1, _translate("MainWindow", "waiting")) 70 self.treeWidget.topLevelItem(0).child(2).setText(0, _translate("MainWindow", "c")) 71 self.treeWidget.topLevelItem(0).child(2).setText(1, _translate("MainWindow", "waiting")) 72 self.treeWidget.topLevelItem(0).child(3).setText(0, _translate("MainWindow", "d")) 73 self.treeWidget.topLevelItem(0).child(3).setText(1, _translate("MainWindow", "waiting")) 74 self.treeWidget.topLevelItem(1).setText(0, _translate("MainWindow", "Test2")) 75 self.treeWidget.topLevelItem(1).setText(1, _translate("MainWindow", "waiting")) 76 self.treeWidget.topLevelItem(1).child(0).setText(0, _translate("MainWindow", "a")) 77 self.treeWidget.topLevelItem(1).child(0).setText(1, _translate("MainWindow", "waiting")) 78 self.treeWidget.topLevelItem(1).child(1).setText(0, _translate("MainWindow", "b")) 79 self.treeWidget.topLevelItem(1).child(1).setText(1, _translate("MainWindow", "waiting")) 80 self.treeWidget.topLevelItem(1).child(2).setText(0, _translate("MainWindow", "c")) 81 self.treeWidget.topLevelItem(1).child(2).setText(1, _translate("MainWindow", "waiting")) 82 self.treeWidget.topLevelItem(1).child(3).setText(0, _translate("MainWindow", "d")) 83 self.treeWidget.topLevelItem(1).child(3).setText(1, _translate("MainWindow", "waiting")) 84 self.treeWidget.topLevelItem(1).child(4).setText(0, _translate("MainWindow", "e")) 85 self.treeWidget.topLevelItem(1).child(4).setText(1, _translate("MainWindow", "waiting")) 86 self.treeWidget.setSortingEnabled(__sortingEnabled)

View Code

动态添加数据

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

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

11 item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) 22 brush = QtGui.QBrush(QtGui.QColor(170, 0, 255)) 33 brush.setStyle(QtCore.Qt.SolidPattern) 44 item_0.setBackground(0, brush)

其中item_0就是根节点

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

item_1 = QtWidgets.QTreeWidgetItem(item_0)

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

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

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

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

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

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

treeview_data.py

1class DataCollection: 2 def __init__(self): 3 self.module = {} 4 self.items = [] 5 6 def set_module(self, module_dic): 7 self.module = module_dic 8 9 def add_item(self, item_dic): 10 self.items.append(item_dic) 11 12 def set_item(self, item_dic, item_name): 13 for item_num, item in enumerate(self.items): 14 for name, result in item.items(): 15 if name == item_name: 16 self.items[item_num][name] = item_dic[name] 17 break 18 all_pass = True 19 for item1 in self.items: 20 for result1 in item1.values(): 21 if result1 != "p": 22 all_pass = False 23 break 24 if all_pass: 25 for module_name, module_result in self.module.items(): 26 self.module[module_name] = "p" 27 28 29if __name__ == "__main__": 30 module_1 = DataCollection() 31 module_1.set_module({"Test1": "t"}) 32 module_1.add_item({"a": "t"}) 33 module_1.add_item({"b": "t"}) 34 module_1.add_item({"c": "t"}) 35 module_1.add_item({"d": "t"}) 36 module_1.set_item({"a": "p"}, "a") 37 module_1.set_item({"b": "p"}, "b") 38 module_1.set_item({"c": "p"}, "c") 39 module_1.set_item({"d": "p"}, "d")

View Code

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

1# -*- coding: utf-8 -*- 2 3# Form implementation generated from reading ui file 'treeview3.ui' 4# 5# Created by: PyQt5 UI code generator 5.13.0 6# 7# WARNING! All changes made in this file will be lost! 8 9 10from PyQt5 import QtCore, QtGui, QtWidgets 11import treeview_data 12 13 14class Ui_MainWindow(object): 15 def setupUi(self, MainWindow): 16 MainWindow.setObjectName("MainWindow") 17 MainWindow.resize(800, 600) 18 self.centralwidget = QtWidgets.QWidget(MainWindow) 19 self.centralwidget.setObjectName("centralwidget") 20 self.treeWidget = QtWidgets.QTreeWidget(self.centralwidget) 21 self.treeWidget.setGeometry(QtCore.QRect(200, 120, 256, 192)) 22 self.treeWidget.setObjectName("treeWidget") 23 font = QtGui.QFont() 24 font.setPointSize(14) 25 self.treeWidget.headerItem().setFont(0, font) 26 font = QtGui.QFont() 27 font.setPointSize(14) 28 self.treeWidget.headerItem().setFont(1, font) 29 # item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) 30 # brush = QtGui.QBrush(QtGui.QColor(170, 0, 255)) 31 # brush.setStyle(QtCore.Qt.SolidPattern) 32 # item_0.setBackground(0, brush) 33 # brush = QtGui.QBrush(QtGui.QColor(0, 255, 0)) 34 # brush.setStyle(QtCore.Qt.SolidPattern) 35 # item_0.setBackground(1, brush) 36 # item_1 = QtWidgets.QTreeWidgetItem(item_0) 37 # item_1 = QtWidgets.QTreeWidgetItem(item_0) 38 # item_1 = QtWidgets.QTreeWidgetItem(item_0) 39 # item_1 = QtWidgets.QTreeWidgetItem(item_0) 40 # item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) 41 # item_1 = QtWidgets.QTreeWidgetItem(item_0) 42 # item_1 = QtWidgets.QTreeWidgetItem(item_0) 43 # item_1 = QtWidgets.QTreeWidgetItem(item_0) 44 # item_1 = QtWidgets.QTreeWidgetItem(item_0) 45 # item_1 = QtWidgets.QTreeWidgetItem(item_0) 46 MainWindow.setCentralWidget(self.centralwidget) 47 self.menubar = QtWidgets.QMenuBar(MainWindow) 48 self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21)) 49 self.menubar.setObjectName("menubar") 50 MainWindow.setMenuBar(self.menubar) 51 self.statusbar = QtWidgets.QStatusBar(MainWindow) 52 self.statusbar.setObjectName("statusbar") 53 MainWindow.setStatusBar(self.statusbar) 54 55 self.retranslateUi(MainWindow) 56 QtCore.QMetaObject.connectSlotsByName(MainWindow) 57 58 def retranslateUi(self, MainWindow): 59 _translate = QtCore.QCoreApplication.translate 60 MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 61 self.treeWidget.headerItem().setText(0, _translate("MainWindow", "Key")) 62 self.treeWidget.headerItem().setText(1, _translate("MainWindow", "Value")) 63 __sortingEnabled = self.treeWidget.isSortingEnabled() 64 self.treeWidget.setSortingEnabled(False) 65 self.insert_data_to_tree_view(_translate) 66 # self.treeWidget.topLevelItem(0).setText(0, _translate("MainWindow", "Test1")) 67 # self.treeWidget.topLevelItem(0).setText(1, _translate("MainWindow", "waiting")) 68 # self.treeWidget.topLevelItem(0).child(0).setText(0, _translate("MainWindow", "a")) 69 # self.treeWidget.topLevelItem(0).child(0).setText(1, _translate("MainWindow", "waiting")) 70 # self.treeWidget.topLevelItem(0).child(1).setText(0, _translate("MainWindow", "b")) 71 # self.treeWidget.topLevelItem(0).child(1).setText(1, _translate("MainWindow", "waiting")) 72 # self.treeWidget.topLevelItem(0).child(2).setText(0, _translate("MainWindow", "c")) 73 # self.treeWidget.topLevelItem(0).child(2).setText(1, _translate("MainWindow", "waiting")) 74 # self.treeWidget.topLevelItem(0).child(3).setText(0, _translate("MainWindow", "d")) 75 # self.treeWidget.topLevelItem(0).child(3).setText(1, _translate("MainWindow", "waiting")) 76 # self.treeWidget.topLevelItem(1).setText(0, _translate("MainWindow", "Test2")) 77 # self.treeWidget.topLevelItem(1).setText(1, _translate("MainWindow", "waiting")) 78 # self.treeWidget.topLevelItem(1).child(0).setText(0, _translate("MainWindow", "a")) 79 # self.treeWidget.topLevelItem(1).child(0).setText(1, _translate("MainWindow", "waiting")) 80 # self.treeWidget.topLevelItem(1).child(1).setText(0, _translate("MainWindow", "b")) 81 # self.treeWidget.topLevelItem(1).child(1).setText(1, _translate("MainWindow", "waiting")) 82 # self.treeWidget.topLevelItem(1).child(2).setText(0, _translate("MainWindow", "c")) 83 # self.treeWidget.topLevelItem(1).child(2).setText(1, _translate("MainWindow", "waiting")) 84 # self.treeWidget.topLevelItem(1).child(3).setText(0, _translate("MainWindow", "d")) 85 # self.treeWidget.topLevelItem(1).child(3).setText(1, _translate("MainWindow", "waiting")) 86 # self.treeWidget.topLevelItem(1).child(4).setText(0, _translate("MainWindow", "e")) 87 # self.treeWidget.topLevelItem(1).child(4).setText(1, _translate("MainWindow", "waiting")) 88 self.treeWidget.setSortingEnabled(__sortingEnabled) 89 90 def insert_data_to_tree_view(self, _translate): 91 list_objects = [] 92 test1 = treeview_data.DataCollection() 93 test1.set_module({"Test1": "waiting"}) 94 test1.add_item({"a1": "waiting"}) 95 test1.add_item({"b1": "waiting"}) 96 test1.add_item({"c1": "waiting"}) 97 list_objects.append(test1) 98 99 test2 = treeview_data.DataCollection() 100 test2.set_module({"Test2": "waiting"}) 101 test2.add_item({"a2": "waiting"}) 102 test2.add_item({"b2": "waiting"}) 103 test2.add_item({"c2": "waiting"}) 104 test2.add_item({"d2": "waiting"}) 105 list_objects.append(test2) 106 107 test3 = treeview_data.DataCollection() 108 test3.set_module({"Test3": "waiting"}) 109 test3.add_item({"a2": "waiting"}) 110 test3.add_item({"b2": "waiting"}) 111 test3.add_item({"c2": "waiting"}) 112 test3.add_item({"d2": "waiting"}) 113 list_objects.append(test3) 114 115 for object_num, object_module in enumerate(list_objects): 116 item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) 117 brush = QtGui.QBrush(QtGui.QColor(176, 165, 172)) 118 brush.setStyle(QtCore.Qt.SolidPattern) 119 item_0.setBackground(0, brush) 120 for module_name, module_result in object_module.module.items(): 121 brush = QtGui.QBrush(QtGui.QColor(0, 255, 0)) 122 brush.setStyle(QtCore.Qt.SolidPattern) 123 item_0.setBackground(1, brush) 124 self.treeWidget.topLevelItem(object_num).setText(0, _translate("MainWindow", module_name)) 125 self.treeWidget.topLevelItem(object_num).setText(1, _translate("MainWindow", module_result)) 126 for item_num, item_dic in enumerate(object_module.items): 127 for item_name, item_result in item_dic.items(): 128 item_1 = QtWidgets.QTreeWidgetItem(item_0) 129 self.treeWidget.topLevelItem(object_num).child(item_num).setText(0, _translate("MainWindow", item_name)) 130 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()

就行了。

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

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

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