网站首页 > 技术文章 正文
高级组件不是说这个组件有多”高级”的意思,而是表示功能强大的意思。如要实现一个功能完整的表格功能,可能需要花上好几天,编写好多代码才能实现,而直接调用wx.Grid组件,三两下就搞定了,所以说这个组件很高级。
PyQt5常用的高级组件有表格视图控件QTableView和QTableWidget、列表视图QList
View和QListWidget,树状结构QTreeWidget和标签视图QTabWidget。
表格视图控件QTableView需要和数据模型配套使用。表格的数据模型,需要填上每一行每一列的数据,就像execl表格一样。
QTableView是基于MVC模式设计的,M(Model)是数据模型,V(view)是指QTableView视图,用来显示数据模型,C(controllor)是控制器,与View合并到一起了。通过setModel()方法绑定数据源。它常用方法如下表所示:
方法 | 描述 |
setSpan(int, int, int, int) | 合并行列,4个参数分别是起始行、起始列、合并行数和列表; |
clearSpans() | 清除所有合并的单元格(取消合并); |
setSelectionBehavior() | 值为QAbstractItemView.SelectRows时,将按行选中,而不是默认的可选中所有行; |
setSelectionModel() | 值为QAbstractItemView.SingleSelection时,将按单元格选中,而不是默认的可选中所有行; |
setEditTriggers() | 值为QTableView.NoEditTriggers时,将单元格置为不可编辑; |
hideColumn(int column) | 隐藏指定的列; |
showColumn(int column) | 显示指定的列; |
hideRow(int row) | 隐藏指定的行; |
showRow(int row) | 显示指定的行; |
horizontalHeader() | 返回水平表头对象,调用setSectionResizeMode(QHeaderView.Stretch)时,所有列平均分配;调用setStretchLastSection(True)时,最后一列自动拉伸。 |
isColumnHidden(int column) | 返回bool值,表示列是否处于隐藏状态; |
isRowHidden(int row) | 返回bool值,表示行是否处于隐藏状态; |
resizeColumnToContents(int column) | 根据内容调整指定列的列宽,column为列的下标,从0开始; |
resizeColumnsToContents() | 根据内容调整所有列的列宽; |
resizeRowToContents(int row) | 根据内容调整指定行的行高,row为行的下标,从0开始; |
resizeRowsToContents() | 根据内容调整所有行的行高; |
sortByColumn(int column, SortOrder order) | 对column进行排序,排序方式由order指定, Qt.DescendingOrder降序,Qt.AscendingOrder升序; |
setModel(QAbstractItemModel) | 绑定模型数据。 |
表格视图控件QTableView可以绑定的模型数据如下表所示:
模型名称 | 描述 |
QStringListModel | 储存一组字符串; |
QStandardItemModel | 存储任意层次结构的数据; |
QDirModel | 对文件系统进行封装; |
QSqlQueryModel | 对SQL的查询结果集进行封装; |
QSqlTableModel | 对SQL中的表格进行封装; |
QSqlRelationalTableModel | 对带有foreign key的SQL表格进行封装。 |
模型的常用方法如下表所示:
方法 | 描述 |
setHorizontalHeaderLabels([str] labels) | 用于一次性顺序设置水平表头多个节显示的文本,该方法无返回值。设置了标签的节自动会创建该节对应的项; |
setVerticalHeaderLabels([str] labels) | 用于一次性顺序设置垂直表头多个节显示的文本,该方法无返回值。设置了标签的节自动会创建该节对应的项; |
setItem() | 向模板里添加item; |
appendRow() | 添加QStandItem数据; |
findItems(str,Qt.MatchExactly, int column) | 在指定列里查找数据,返回List; |
removeRows(int row) | 删除指定行的数据; |
data(QModelIndex index) | 获取单元格的值; |
columnCount() | 获取总列数; |
程序清单:table.py
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget,
QHBoxLayout, QTableView, QAbstractItemView
from PyQt5.QtGui import QStandardItemModel, QStandardItem,
QBrush, QColor
from PyQt5.QtCore import Qt
# 继承QWidget
class TableViewWidget(QWidget):
customer_list = [("张三", "男", "1981-06-02", "13888888888",
"南极路企鹅临舍傍9号999路"),
("李四", "男", "1988-08-08", "13999999999",
"北极熊店的下坡路中6号666路"),
("李清照", "女", "1986-06-06", "13666666666",
"秦岭古诗庙湾道8号888路")]
itemModel = None
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# 设置布局
layout = QHBoxLayout()
table_view = QTableView(self)
# 数据层次结构,10行5列
self.itemModel = QStandardItemModel(10, 5)
# 表头
self.itemModel.setHorizontalHeaderLabels(["姓名", "性别", "生日",
"手机号", "地址"])
# 输入内容
for (row, customer) in enumerate(self.customer_list):
for column in range(len(customer)):
self.itemModel.setItem(row, column,
QStandardItem(customer[column]))
# 绑定数据源
table_view.setModel(self.itemModel)
# 最后一列自动拉伸
table_view.horizontalHeader().setStretchLastSection(True)
items = self.itemModel.findItems("13666666666",
Qt.MatchExactly, 3)
# 设置单元格的背脊颜色为红
if len(items) > 0:
items[0].setForeground(QBrush(QColor(255, 0, 0)))
layout.addWidget(table_view)
# 合并行列
table_view.setSpan(0, 1, 2, 1)
# 单元格不可编辑
table_view.setEditTriggers(QTableView.NoEditTriggers)
# 选择单行
table_view.setSelectionBehavior(QAbstractItemView.SelectRows)
# 单击事件
table_view.clicked.connect(self.table_click)
# 双击事件
table_view.doubleClicked.connect(self.double_click)
self.setLayout(layout)
# 调整窗口大小
self.resize(900, 500)
# 窗口居中
self.center()
# 窗口标题
self.setWindowTitle("表格应用")
# 显示窗口
self.show()
# 获取文件夹路径
def table_click(self, model_index):
# 选中行和列的下标
row = model_index.row()
column = model_index.column()
item = self.itemModel.index(row, column).data()
print("选中单元格的值:%s" % item)
# 选中单元格的值
column_data = self.itemModel.data(model_index)
print("选中单元格的值:%s" % column_data)
# 总列数
column_count = self.itemModel.columnCount()
for i in range(column_count):
# 根据行列获取单元格里的值
item = self.itemModel.index(row, i).data()
print(item, end=" ")
def double_click(self, model_index):
# 选中单元格的值
column_data = self.itemModel.data(model_index)
print(column_data)
# 实现居中
def center(self):
f = self.frameGeometry()
c = QDesktopWidget().availableGeometry().center()
f.moveCenter(c)
self.move(f.topLeft())
if __name__ == "__main__":
app = QApplication(sys.argv)
w = TableViewWidget()
sys.exit(app.exec_())
运行程序之后,弹出的窗口如下:
好了,QTableView的内容就说到这了,关注我,下一节更精彩。
码字不易,你的关注和转发是对我最大的鼓励,谢谢!
一个当了10年技术总监的老家伙,分享多年的编程经验。想学编程的朋友,关注我,你就赚到了。我正在分享Python、前端、Java和App方面的干货了。赶紧来围观啊!!!
猜你喜欢
- 2024-10-20 Qt 开发经验总结 qt软件开发
- 2024-10-20 Qt QTableWidget用法总结 qtablewidget qtableview
- 2024-10-20 实战PyQt5: 068-MV框架中的项视图部件
- 2024-10-20 Qt开发经验小技巧231-235 qt开发入门简介
- 2024-10-20 Python+PyQt5进阶(5) pyqt5 django
- 2024-10-20 Qt项目升级到Qt6经验总结 qt更新界面
- 2024-10-20 QTableWidget表格中增删数据 qtablewidget清空表格
- 2024-10-20 C/C++ Qt StatusBar 底部状态栏应用
- 2024-10-20 Qt的常用控件 qt控件详解
- 2024-10-20 Python PyQt5通过QTableWidget表格控件操作SQLite数据库
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)