表格与树解决的问题是如何在一个控件中有规律地呈现更多的数据。PyQt提供了两种控件类用于解决该问题,其中一种是表格结构的控件类;另一种是树形结构的控件类。

QTableView

以表格形式输出信息,可以使用自定义的数据模型来显示内容,通过setModel来绑定数据源。

继承结构如下

QTableWidget继承自QTableView,主要区别是QTableView可以使用自定义的数据模型来显示内容(先要通过setModel来绑定数据源), 而QTableWidget 只能使用标准的数据模型,并且其单元格数据是通过QTableWidgetItem对象来实现的。通常使用QTableWidget就能够满足我们的要求。

可用的模式如下

QStringListModel 存储一组字符串
QStandardltemModel 存储任意层次结构的数据
QDirModel 对文件系统进行封装
QSqlQueryModel 对SQL的查询结果集进行封装
QSqITableModel 对SQL中的表格进行封装
QSqIRelationalTableModel 对带有foreign key 的SQL表格进行封装
QSortFilterProxyModel 对模型中的数据进行排序或过滤

代码示例

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sysclass Table(QWidget):def __init__(self, arg=None):super(Table, self).__init__(arg)self.setWindowTitle("QTableView表格视图控件的例子")self.resize(500, 300)self.model = QStandardItemModel(4, 4)self.model.setHorizontalHeaderLabels(['标题1', '标题2', '标题3', '标题4'])for row in range(4):for column in range(4):item = QStandardItem("row %s, column %s" % (row, column))self.model.setItem(row, column, item)self.tableView = QTableView()self.tableView.setModel(self.model)# 添加数据self.model.appendRow([QStandardItem("row %s, column %s" % (11, 11)),QStandardItem("row %s, column %s" % (11, 11)),QStandardItem("row %s, column %s" % (11, 11)),QStandardItem("row %s, column %s" % (11, 11)),])# # 下面代码让表格100%填满窗口# self.tableView.horizontalHeader().setStretchLastSection(True)# self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)# # 删除当前选中的数据# # 取当前选中的所有行# indexs = self.tableView.selectionModel().selection().indexes()# if len(indexs) > 0:#     # 取第一行的索引#     index = indexs[0]#     self.model.removeRows(index.row(), 1)dlgLayout = QVBoxLayout()dlgLayout.addWidget(self.tableView)self.setLayout(dlgLayout)if __name__ == '__main__':app = QApplication(sys.argv)table = Table()table.show()sys.exit(app.exec_())

QListView

QListView类用于展示数据,它的子类是QListWidget。QListView是基于模型(Model)的,需要程序来建立模型,然后再保存数据。

QListWidget 是一个升级版本的QListView,它已经建立了一个数据存储模型(QListWidgetltem),直接调用addItem()函数,就可以添加条目(Item)。

QListView类中的常用方法

setModel() 用来设置View所关联的Model,可以使用Python原生的list作为数据源Model
selectedItem() 选中Model中的条目
isSelected() 判断Model中的某条目是否被选中

QListView类中的常用信号

clicked 当单击某项时,信号被发射
doubleClicked 当双击某项时,信号被发射

代码示例

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QListView, QMessageBox
from PyQt5.QtCore import QStringListModel
import sysclass ListViewDemo(QWidget):def __init__(self, parent=None):super(ListViewDemo, self).__init__(parent)self.setWindowTitle("QListView 例子")self.resize(300, 270)layout = QVBoxLayout()listView = QListView()slm = QStringListModel();self.qList = ['Item 1', 'Item 2', 'Item 3', 'Item 4']slm.setStringList(self.qList)listView.setModel(slm)listView.clicked.connect(self.clicked)layout.addWidget(listView)self.setLayout(layout)def clicked(self, qModelIndex):QMessageBox.information(self, "QListView", "你选择了: " + self.qList[qModelIndex.row()])if __name__ == "__main__":app = QApplication(sys.argv)win = ListViewDemo()win.show()sys.exit(app.exec_())

QListWidget

QListWidet类是一个基于条目的接口,用于从列表中添加或删除条目。列表中的每个条目都是一个QListWidgetltem对象。QListWidget可以设置为多重选择。

常用方法

addltem() 在列表中添加QListWidgetltem对象或字符串
addltems() 添加列表中的每个条目
insertltem() 在指定的索引处插入条目
clear() 删除列表的内容
setCurrentltem() 设置当前所选条目
sortltems() 按升序重新排列条目

常用信号

currentltemChanged 当列表中的条目发生改变时发射此信号
itemClicked 当点击列表中的条目时发射此信号

代码示例

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class ListWidget(QListWidget):def clicked(self, item):QMessageBox.information(self, "ListWidget", "你选择了: " + item.text())if __name__ == '__main__':app = QApplication(sys.argv)listWidget = ListWidget()listWidget.resize(300, 120)listWidget.addItem("Item 1");listWidget.addItem("Item 2");listWidget.addItem("Item 3");listWidget.addItem("Item 4");listWidget.setWindowTitle('QListwidget 例子')listWidget.itemClicked.connect(listWidget.clicked)listWidget.show()sys.exit(app.exec_())

QTableWidget

常用表格控件,QTableWidget是QTableView的子类, 它使用标准的数据模型,并且其单元格数据是通过QTableWidgetltem对象来实现的。

常用方法

setRowCount(int row) 设置QTableWidget表格控件的行数
setColumnCount(int col) 设置QTableWidget表格控件的列数
setHorizontalHeaderLabels() 设置QTableWidget表格控件的水平标签
setVerticalHeaderLabels() 设置QTableWidget表格控件的垂直标签
setItem(int, int, QTableWidgetItem) 在QTableWidget表格控件的每个选项的单元空间里添加控件
horizontalHeader() 获得QTableWidget表格控件的表格头,以便执行隐藏
rowCount() 获得QTableWidget表格控件的行数
columnCount() 获得QTableWidget表格控件的列数
setEditTriggers(EditTriggers triggers) 设置表格是否可编辑。设置编辑规则的枚举值
setSelectionBehavior 设置表格的选择行为
setTextAlignment() 设置单元格内文字的对齐方式
setSpan(int row, int column, int rowSpanCount, int columnSpanCount) 合并单元格,要改变单元格的第row行第column列,要合并
rowSpanCount 行数和columnSpanCount列数。
row:要改变的单元格行数
column:要改变的单元格列数
rowSpanCount:需要合并的行数
columnSpanCount:需要合并的列数
setShowGrid() 在默认情况下,表格的显示是有网格线的。
True:显示网格线
False:不显示网格线
setColumn Width(int column, int width) 设置单元格行的宽度
setRowHeight(int row, int height) 设置单元格列的高度

编辑规则的枚举值类型

QAbstractltemView.NoEditTriggers 0 不能对表格内容进行修改     0No
QAbstractItemView.CurrentChanged 1 任何时候都能对单元格进行修改     1Editing
QAbstractltemView.DoubleClicked 2 双击单元格     2Editing
QAbstractItemView.SelectedClicked 4 单击已选中的内容     4Editing
QAbstractItemView.EditKeyPressed 8 当修改键被按下时修改单元格     8Editing
QAbstractItemView.AnyKeyPressed 16 按任意键修改单元格     16Editing
QAbstractltemView.AllEditTriggers 31 包括以上所有条件     31Editing

表格的选择行为的枚举值类型

QAbstractItemView.SelectItems 0 选中单个单元格
QAbstractItemView.SelectRows 1 选中一行
QAbstractItemView.SelectColumns 2 选中一列

单元格文本的水平对齐方式

Qt.AlignLeft 将单元格的内容沿单元格的左边缘对齐
Qt.AlignRight 将单元格的内容沿单元格的右边缘对齐
Qt.AlignHCenter 在可用空间中,居中显示在水平方向上
Qt.AlignJustify 将文本在可用空间中对齐,默认是从左到右的

单元格文本的垂直对齐方式

Qt.AlignTop 与顶部对齐
Qt.AlignBotom 与底部对齐
Qt.AlignVCenter 在可用空间中,居中显示在垂直方向上
Qt.AlignBaseline 与基线对齐

代码示例1

import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem, QAbstractItemView,QHeaderView)class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(430, 230)conLayout = QHBoxLayout()# 设置表格尺寸# self.table = QTableWidget(4, 3)tableWidget = QTableWidget()tableWidget.setRowCount(4)tableWidget.setColumnCount(3)conLayout.addWidget(tableWidget)# 设置表头tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])tableWidget.setVerticalHeaderLabels(['行1', '行2', '行3', '行4', '行5'])# 设置表头为伸缩模式tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)newItem = QTableWidgetItem("张三")tableWidget.setItem(0, 0, newItem)newItem = QTableWidgetItem("男")tableWidget.setItem(0, 1, newItem)newItem = QTableWidgetItem("160")tableWidget.setItem(0, 2, newItem)# 将表格变为禁止编辑# tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)# 设置表格为整行选择# tableWidget.setSelectionBehavior( QAbstractItemView.SelectRows)# 将行和列的大小设为与内容相匹配# tableWidget.resizeColumnsToContents()# tableWidget.resizeRowsToContents()# 表格表头的显示与隐藏# tableWidget.verticalHeader().setVisible(False)# tableWidget.horizontalHeader().setVisible(False)# 不显示表格单元格的分割线# tableWidget.setShowGrid(False)# 不显示垂直表头# tableWidget.verticalHeader().setVisible(False)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())

代码示例2

通过TableWidget.setItem()向单元格中添加PyQt的基本控件。

import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem, QAbstractItemView,QComboBox, QPushButton)class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(430, 300);conLayout = QHBoxLayout()tableWidget = QTableWidget()tableWidget.setRowCount(4)tableWidget.setColumnCount(3)conLayout.addWidget(tableWidget)tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])newItem = QTableWidgetItem("张三")tableWidget.setItem(0, 0, newItem)comBox = QComboBox()comBox.addItem("男")comBox.addItem("女")comBox.setStyleSheet("QComboBox{margin:3px};")tableWidget.setCellWidget(0, 1, comBox)searchBtn = QPushButton("修改")searchBtn.setDown(True)searchBtn.setStyleSheet("QPushButton{margin:3px};")tableWidget.setCellWidget(0, 2, searchBtn)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())

代码示例3

在表格中快速定位到指定行,当tableWidget表格的行数很多时,可以通过输入行号进行直接定位并显示,比如输入10,就直接显示第10行。

import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtCore
from PyQt5.QtGui import QColor, QBrushclass Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(600, 800);conLayout = QHBoxLayout()tableWidget = QTableWidget()tableWidget.setRowCount(30)tableWidget.setColumnCount(4)conLayout.addWidget(tableWidget)for i in range(30):for j in range(4):itemContent = '(%d,%d)' % (i, j)tableWidget.setItem(i, j, QTableWidgetItem(itemContent))self.setLayout(conLayout)# 遍历表查找对应的itemtext = "(10,1)"items = tableWidget.findItems(text, QtCore.Qt.MatchExactly)item = items[0]# 选中单元格# item.setSelected( True)# 设置单元格的字体颜色为红色item.setForeground(QBrush(QColor(255, 0, 0)))row = item.row()# 滚轮定位过去,快速定位到第11行tableWidget.verticalScrollBar().setSliderPosition(row)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())

代码示例4

将单元格文本颜色设置为红色,字体加粗

import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem)
from PyQt5.QtGui import QBrush, QColor, QFontclass Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(430, 230)conLayout = QHBoxLayout()tableWidget = QTableWidget()tableWidget.setRowCount(4)tableWidget.setColumnCount(3)conLayout.addWidget(tableWidget)tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])newItem = QTableWidgetItem("张三")# 设置字体颜色newItem.setForeground(QBrush(QColor(255, 0, 0)))# 设置字体加粗newItem.setFont(QFont("Times", 12, QFont.Black))# 设置字体右下newItem.setTextAlignment(Qt.AlignRight | Qt.AlignBottom)tableWidget.setItem(0, 0, newItem)newItem = QTableWidgetItem("男")newItem.setFont(QFont("Times", 12, QFont.Black))tableWidget.setItem(0, 1, newItem)newItem = QTableWidgetItem("160")newItem.setForeground(QBrush(QColor(255, 0, 0)))tableWidget.setItem(0, 2, newItem)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())

代码示例5

设置表格的排序方式

查看Qt的开发文档(https://doc.qt.io/qt-5/qt.html#details),可以看到使用Qt.DescendingOrder表示在单元格内降序排列,使用Qt.AscendingOrder表示在单元格内升序排列。

import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem)
from PyQt5.QtCore import Qtclass Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(430, 230)conLayout = QHBoxLayout()tableWidget = QTableWidget()tableWidget.setRowCount(4)tableWidget.setColumnCount(3)conLayout.addWidget(tableWidget)tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])newItem = QTableWidgetItem("张三")tableWidget.setItem(0, 0, newItem)newItem = QTableWidgetItem("男")tableWidget.setItem(0, 1, newItem)newItem = QTableWidgetItem("160")tableWidget.setItem(0, 2, newItem)newItem = QTableWidgetItem("李四")tableWidget.setItem(1, 0, newItem)newItem = QTableWidgetItem("女")tableWidget.setItem(1, 1, newItem)newItem = QTableWidgetItem("155")tableWidget.setItem(1, 2, newItem)newItem = QTableWidgetItem("王五")tableWidget.setItem(2, 0, newItem)newItem = QTableWidgetItem("男")tableWidget.setItem(2, 1, newItem)newItem = QTableWidgetItem("170")tableWidget.setItem(2, 2, newItem)# Qt.DescendingOrder 降序# Qt.AscendingOrder 升序tableWidget.sortItems(2, Qt.DescendingOrder)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())

代码示例6

合并单元格,将表格中第一行第一列的单元格,更改为占据3行1列

import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem)class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(430, 230)conLayout = QHBoxLayout()tableWidget = QTableWidget()tableWidget.setRowCount(4)tableWidget.setColumnCount(3)conLayout.addWidget(tableWidget)tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])tableWidget.setSpan(0, 0, 3, 1)newItem = QTableWidgetItem("张三")tableWidget.setItem(0, 0, newItem)newItem = QTableWidgetItem("男")tableWidget.setItem(0, 1, newItem)newItem = QTableWidgetItem("160")tableWidget.setItem(0, 2, newItem)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())

代码示例7

设置单元格大小

import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem)class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(530, 300);conLayout = QHBoxLayout()tableWidget = QTableWidget()tableWidget.setRowCount(4)tableWidget.setColumnCount(3)conLayout.addWidget(tableWidget)tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])newItem = QTableWidgetItem("张三")tableWidget.setItem(0, 0, newItem)# 将第1列的单元格,设置成150宽度tableWidget.setColumnWidth(0, 150)# 将第1行的单元格,设置成120的高度tableWidget.setRowHeight(0, 120)newItem = QTableWidgetItem("男")tableWidget.setItem(0, 1, newItem)newItem = QTableWidgetItem("160")tableWidget.setItem(0, 2, newItem)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())

代码示例8

在单元格内添加图片,并显示图片的描述信息

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(500, 300);conLayout = QHBoxLayout()self.tableWidget = QTableWidget()self.tableWidget.setRowCount(5)self.tableWidget.setColumnCount(4)conLayout.addWidget(self.tableWidget)self.tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重', '显示图片'])self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)newItem = QTableWidgetItem("张三")self.tableWidget.setItem(0, 0, newItem)newItem = QTableWidgetItem("男")self.tableWidget.setItem(0, 1, newItem)newItem = QTableWidgetItem("160")self.tableWidget.setItem(0, 2, newItem)newItem = QTableWidgetItem(QIcon("./images/bao1.png"), "背包")self.tableWidget.setItem(0, 3, newItem)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())

代码示例9

改变单元格中显示图片的大小

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(1000, 900);conLayout = QHBoxLayout()table = QTableWidget()table.setColumnCount(3)table.setRowCount(5)table.setHorizontalHeaderLabels(['图片1', '图片2', '图片3'])table.setEditTriggers(QAbstractItemView.NoEditTriggers)table.setIconSize(QSize(300, 200));for i in range(3):  # 让列宽和图片相同table.setColumnWidth(i, 300)for i in range(5):  # 让行高和图片相同table.setRowHeight(i, 200)for k in range(15):  # 27 examples of DDAi = k / 3j = k % 3item = QTableWidgetItem()item.setFlags(Qt.ItemIsEnabled)  # 用户点击时表格时,图片被选中icon = QIcon(r'.\images\bao%d.png' % k)item.setIcon(QIcon(icon))print('e/icons/%d.png i=%d  j=%d' % (k, i, j))table.setItem(i, j, item)conLayout.addWidget(table)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())

通过实现itemClicked (QTableWidgetItem *)信号的槽函数,可以获得所点击的单元格的引用,进而获得其中的内容。以下代码将itemClicked信号与getltem()函数进行绑定

        tableWidget.itemClicked.connect(self.handleItemClick)def getItem(self, item):print("你选择的=>" + item.text())

代码示例10

支持右键菜单

import sys
from PyQt5.QtWidgets import (QMenu, QPushButton, QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem,QHeaderView)
from PyQt5.QtCore import QObject, Qtclass Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(500, 300)conLayout = QHBoxLayout()self.tableWidget = QTableWidget()self.tableWidget.setRowCount(5)self.tableWidget.setColumnCount(3)conLayout.addWidget(self.tableWidget)self.tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重'])self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)newItem = QTableWidgetItem("张三")self.tableWidget.setItem(0, 0, newItem)newItem = QTableWidgetItem("男")self.tableWidget.setItem(0, 1, newItem)newItem = QTableWidgetItem("160")self.tableWidget.setItem(0, 2, newItem)# 表格中第二行记录newItem = QTableWidgetItem("李四")self.tableWidget.setItem(1, 0, newItem)newItem = QTableWidgetItem("女")self.tableWidget.setItem(1, 1, newItem)newItem = QTableWidgetItem("170")self.tableWidget.setItem(1, 2, newItem)self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu)  ######允许右键产生子菜单self.tableWidget.customContextMenuRequested.connect(self.generateMenu)  ####右键菜单self.setLayout(conLayout)def generateMenu(self, pos):# rint( pos)row_num = -1for i in self.tableWidget.selectionModel().selection().indexes():row_num = i.row()if row_num < 2:menu = QMenu()item1 = menu.addAction(u"选项一")item2 = menu.addAction(u"选项二")item3 = menu.addAction(u"选项三")action = menu.exec_(self.tableWidget.mapToGlobal(pos))if action == item1:print('您选了选项一,当前行文字内容是:', self.tableWidget.item(row_num, 0).text(),self.tableWidget.item(row_num, 1).text(), self.tableWidget.item(row_num, 2).text())elif action == item2:print('您选了选项二,当前行文字内容是:', self.tableWidget.item(row_num, 0).text(),self.tableWidget.item(row_num, 1).text(), self.tableWidget.item(row_num, 2).text())elif action == item3:print('您选了选项三,当前行文字内容是:', self.tableWidget.item(row_num, 0).text(),self.tableWidget.item(row_num, 1).text(), self.tableWidget.item(row_num, 2).text())else:returnif __name__ == '__main__':app = QApplication(sys.argv)example = Table()example.show()sys.exit(app.exec_())

QTreeView

树形结构

QTreeWidget类中的常用方法

setColumnWidth(int column, int width) 将指定列的宽度设置为给定的值
Column,指定的列
Width,指定列的宽度
insertTopLevelItems() 在视图的顶层索引中插入项目列表
expandAll() 展开所有的树形节点
invisibleRootItem() 返回树形控件中不可见的根选项(Root Item)
selectedltems() 返回所有选定的非隐藏项目的列表

QTreeWidgetItem类中的常用方法

addChild() 将子项追加到子列表中
setText() 设置显示的节点文本
Text() 返回显示的节点文本
setCheckState(column, state) 设置指定列的选中状态:
Qt.Checked,节点选中
Qt.Unchecked,节点未选中
sctIcon(column, icon) 在指定的列中显示图标

代码示例1

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon, QBrush, QColor
from PyQt5.QtCore import Qtclass TreeWidgetDemo(QMainWindow):def __init__(self, parent=None):super(TreeWidgetDemo, self).__init__(parent)self.setWindowTitle('TreeWidget 例子')self.tree = QTreeWidget()# 设置列数self.tree.setColumnCount(2)# 设置头的标题self.tree.setHeaderLabels(['Key', 'Value'])# 设置根节点root = QTreeWidgetItem(self.tree)root.setText(0, 'root')root.setIcon(0, QIcon("./images/root.png"))# 设置列宽self.tree.setColumnWidth(0, 160)## 设置节点的背景颜色brush_red = QBrush(Qt.red)root.setBackground(0, brush_red)brush_green = QBrush(Qt.green)root.setBackground(1, brush_green)# 设置子节点1child1 = QTreeWidgetItem(root)child1.setText(0, 'child1')child1.setText(1, 'ios')child1.setIcon(0, QIcon("./images/IOS.png"))child1.setCheckState(0, Qt.Checked)# 设置子节点2child2 = QTreeWidgetItem(root)child2.setText(0, 'child2')child2.setText(1, '')child2.setIcon(0, QIcon("./images/android.png"))# 设置子节点3child3 = QTreeWidgetItem(child2)child3.setText(0, 'child3')child3.setText(1, 'android')child3.setIcon(0, QIcon("./images/music.png"))self.tree.addTopLevelItem(root)# 结点全部展开self.tree.expandAll()self.setCentralWidget(self.tree)if __name__ == '__main__':app = QApplication(sys.argv)tree = TreeWidgetDemo()tree.show()sys.exit(app.exec_())

核心结构的其他实现方式

self.tree = QTreeWidget()
# 设置列数
self.tree.setcolumncount(2)
# 设置树形控件头部的标题
self.tree.setHeaderLabels(['Key', 'Value'])
# 设置根节点
root= QTreeWidgetItem()
root.setText{0,"root")rootList = []
rootList.append(root)
# 设置树形控件的子节点1
childl = QTreeWidgetItem()
childl.setText(0, 'child1')
child1.setText(l, 'ios')
root.addChild(childl)self.tree.insertToplevelItems(0, rootList)

代码示例2

单击触发树形控件节点响应事件

from PyQt5.QtWidgets import *
import sysclass TreeWidgetDemo(QMainWindow):def __init__(self, parent=None):super(TreeWidgetDemo, self).__init__(parent)self.setWindowTitle('TreeWidget 例子')self.tree = QTreeWidget()# 设置列数self.tree.setColumnCount(2)# 设置头的标题self.tree.setHeaderLabels(['Key', 'Value'])root = QTreeWidgetItem(self.tree)root.setText(0, 'root')root.setText(1, '0')child1 = QTreeWidgetItem(root)child1.setText(0, 'child1')child1.setText(1, '1')child2 = QTreeWidgetItem(root)child2.setText(0, 'child2')child2.setText(1, '2')child3 = QTreeWidgetItem(root)child3.setText(0, 'child3')child3.setText(1, '3')child4 = QTreeWidgetItem(child3)child4.setText(0, 'child4')child4.setText(1, '4')child5 = QTreeWidgetItem(child3)child5.setText(0, 'child5')child5.setText(1, '5')self.tree.addTopLevelItem(root)self.tree.clicked.connect(self.onTreeClicked)self.setCentralWidget(self.tree)def onTreeClicked(self, qmodelindex):item = self.tree.currentItem()print("key=%s ,value=%s" % (item.text(0), item.text(1)))if __name__ == '__main__':app = QApplication(sys.argv)tree = TreeWidgetDemo()tree.show()sys.exit(app.exec_())

代码示例3

系统定制模式

在上面的例子中,QTreeWidgetltem类的节点是一个个添加的,这样做有时很不方便,特别是当窗口中产生比较复杂的树形结构时,一般都是通过QTreeView类来实现的,而不是QTreeWidget类。QTreeView类与QTreeWidget类最大的区别就是,QTreeView类可以使用操作系统提供的定制模式,比如文件系统盘的树列表。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *if __name__ == '__main__':app = QApplication(sys.argv)# Window系统提供的模式  model = QDirModel()# 创建一个QtreeView部件  tree = QTreeView()# 为部件添加模式  tree.setModel(model)tree.setWindowTitle("QTreeView 例子")tree.resize(640, 480)tree.show()sys.exit(app.exec_())

PYQT5(17)-高级界面控件-表格与树相关推荐

  1. PyQt5高级界面控件之QDockWidget

    使用PyQt5高级界面控件之QDockWidget实现主页面模块关闭与显示 前言 QDockWidget是一个可以停靠在QMainWindow内的窗口控件,它可以保持在浮动状态或者在指定位置作为子窗口 ...

  2. PyQt高级界面控件及操作

    PyQt高级界面控件 一.表格与树结构 1.表格 1.代码示例 2.代码解析: 3.补充说明属性参数 2.树结构 1.自定义树结构 2.系统定制模式 二.QStackedWidget组件 三.QTab ...

  3. PyQt5高级界面控件之QTableWidget(四)

    QTableWidget 前言 QTableWidget是Qt程序中常用的显示数据表格的控件,类似于c#中的DataGrid.QTableWidget是QTableView的子类,它使用标准的数据模型 ...

  4. python 动态调整控件大小_python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例...

    PyQt5动态(可拖动控件大小)布局控件QSplitter简介 PyQt还提供了特殊的布局管理器QSplitter.它可以动态地拖动子控件之间的边界,算是一个动态的布局管理器,QSplitter允许用 ...

  5. python嵌套html开发gui_python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例...

    PyQt5布局控件QFormLayout简介 QFormLayout是label-field式的表单布局,顾明思议,就是实现表单方式的布局,表单是提示用户进行交互的一种模式,主要有两列组成,第一列用于 ...

  6. 基于PyQt5实现界面控件自适应大小

    基于PyQt5实现界面控件自适应大小 界面控件自适应大小,点击窗口放大后,界面控件大小随之发生变化. 实现效果 实例1 点击窗口放大后: 实例2

  7. python界面设计实例qt_python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例...

    在默认情况下,我们使用PyQt5创建出来的窗口和部件都是默认的样式,虽然谈不上很丑,但是也毫无美感可言.其实,在PyQt5中,我们可以有较高的自由度来自定义窗口和各种小部件的样式,通过自定义这些样式, ...

  8. pyqt5中控件缩放功能_python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例...

    PyQt5动态(可拖动控件大小)布局控件QSplitter简介 PyQt还提供了特殊的布局管理器QSplitter.它可以动态地拖动子控件之间的边界,算是一个动态的布局管理器,QSplitter允许用 ...

  9. pyqt5如何循环遍历控件名_PyQt5 控件学习(一个一个学习之QObject对象)

    首先我们要知道控件之间的继承结构,并按照它去学习: 下面是基类的继承图: 所以,我们首先学习的是QObject 和 QWidget 这两个,然后再学其他的. 一: QObject 类: 1, 首先看Q ...

最新文章

  1. 微信公众号为指定openid用户推送消息
  2. [LeetCode]Add Binary
  3. wpf 修改label值_WPF 获取动态添加控件的值
  4. Training RNNs as Fast as CNNs
  5. Linux工程师新法宝:在Visual Studio上用C++ 写Linux
  6. linux 启动 x,(1)linux启动过程
  7. LSI_阵列卡操作手册
  8. 【250期门诊集锦】痛并快乐着的正则表达式
  9. 【2030】排队打水问题
  10. 计算机端口详解(总结)
  11. 分析CVPR 2019论文关键词,我看到了计算机视觉的最新趋势 | 附代码
  12. 网络流(17/24)
  13. 【推荐系统】协同过滤算法
  14. D3.js学习笔记七:多系列折线图与图例
  15. brat标注工具知识总结
  16. iOS Xcode提交IPA时收到苹果邮件ITMS-90338: Non-public API usage
  17. java毕业设计m和vue的酒店管理系统2021(附源码、数据库)
  18. 中国类脑计算先行者:在AI“无人区”探路
  19. iOS端手游和c++交互 lua和c++交互
  20. 地球系统模式(CESM)实践技术应用

热门文章

  1. 泰山杯练习平台部分题目wp
  2. Excel 2010 VBA 入门 100 将xls格式工作簿批量转换为xlsx格式
  3. ML-Agents案例之地牢逃脱
  4. Android音频处理知识(一)MediaRecorder录制音频
  5. Thor UI - 轻量简洁的免费开源移动端 UI 组件库,支持原生小程序和 uni-app
  6. Python爬虫-爬取豆瓣读书
  7. @Test有什么作用
  8. android 模拟器黑屏 Cordova多平台方案
  9. 单片机控制步进电机-VB上位机生成S曲线
  10. HFDS命令行操作(开发重点)