Python GUI开发:PyQt5 QTableView控件详解与实战
本文深入解析PyQt5中QTableView控件的高级用法。通过对比QTableWidget,阐述QTableView结合数据模型(Model)的优势。提供完整代码示例,演示如何绑定字符串与标准数据模型,实现表格自动填充窗口、动态添加行数据以及删除选中行等功能,帮助开发者构建灵活的桌面数据展示界面。
PyQt5表格控件QTableView简介
在大多数应用程序中,数据交互往往以表格形式呈现,此时QTableView类便成为理想选择。该控件支持通过setModel方法绑定自定义数据源,从而灵活地显示各类内容。
QTableWidget直接继承自QTableView,两者的核心差异在于数据模型的使用方式。QTableView允许绑定任意自定义数据模型,而QTableWidget仅能使用标准数据模型,且其单元格内容必须通过QTableWidgetItem对象来管理。在实际开发中,若无需高度定制数据逻辑,QTableWidget通常已足够满足需求。
QTableView可用的模式
QTableView控件的核心机制在于绑定一个模型数据对象,该对象负责更新控件界面上的显示内容。
| 名称 | 含义 |
|---|---|
| QStringListModel | 储存一组字符串 |
| QstandardItemModel | 存储任意层次结构的数据 |
| QDirModel | 对文件系统进行封装 |
| QSqlQueryModel | 对SQL的查询结果集进行封装 |
| QSqlTableModel | 对SQL中的表格进行封装 |
| QSqlRelationalTableModel | 对带有foreign key的SQL表格进行封装 |
| QSortFilterProxyModel | 对模型中的数据进行排序或过滤 |
QTableView的使用实例
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class Table(QWidget):
def __init__(self,parent=None):
super(Table, self).__init__(parent)
#设置标题与初始大小
self.setWindowTitle('QTableView表格视图的例子')
self.resize(500,300)
#设置数据层次结构,4行4列
self.model=QStandardItemModel(4,4)
#设置水平方向四个头标签文本内容
self.model.setHorizontalHeaderLabels(['标题1','标题2','标题3','标题4'])
# #Todo 优化2 添加数据
# 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)),
# ])
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)
# #todo 优化1 表格填满窗口
# #水平方向标签拓展剩下的窗口部分,填满表格
# self.tableView.horizontalHeader().setStretchLastSection(True)
# #水平方向,表格大小拓展到适当的尺寸
# self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
#
# #TODO 优化3 删除当前选中的数据
# indexs=self.tableView.selectionModel().selection().indexes()
# print(indexs)
# if len(indexs)>0:
# index=indexs[0]
# self.model.removeRows(index.row(),1)
#设置布局
layout=QVBoxLayout()
layout.addWidget(self.tableView)
self.setLayout(layout)
if __name__ == '__main__':
app=QApplication(sys.argv)
table=Table()
table.show()
sys.exit(app.exec_())
运行上述程序后,界面显示效果如图所示。

观察界面可知,初始状态下表格并未自动填满整个窗口区域。虽然用户可以对每一列进行自由拉伸调整,但窗口边缘可能会留出空白或出现滚动条,这并非最佳显示效果。
优化1:需要表格填充满窗口,可以添加一下代码
#水平方向标签拓展剩下的窗口部分,填满表格
self.tableView.horizontalHeader().setStretchLastSection(True)
#水平方向,表格大小拓展到适当的尺寸
self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
应用该优化后的效果如下所示。

优化2:添加数据
#Todo 优化2 添加数据
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)),
])
添加数据后的界面效果如图。

优化3:删除当前选中的数据
indexs=self.tableView.selectionModel().selection().indexes()
print(indexs)
if len(indexs)>0:
index=indexs[0]
self.model.removeRows(index.row(),1)

本文主要介绍了PyQt5表格控件QTableView详细使用方法与实例,更多关于这方面的知识请查看下面的相关链接
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









