PyQt6 微信提醒工具 之 QTableView的使用
由于老人帮忙接送小孩,常常忘记时间,所以编写一个自动发送微信消息的小应用
创建
初始化TableView的实例
# 表格使用QTableView类
self.tableView = QtWidgets.QTableView(parent=self.centralwidget)
创建表头数据,注意使用QStandardItemMode
类
from PyQt6.QtGui import QStandardItemModel,QStandardItem
headers = ["主题", "接收者1", "接收者2", "内容", "星期几", "时间"]
self.model = QStandardItemModel(5, len(headers))
for i, header in enumerate(headers):
self.model.setHorizontalHeaderItem(i, QStandardItem(header))
更新模型数据model
def _update_table_data(self):
datas = getWechatDb().query_all() # 从sqlite3 读取表内的数据
self.model.setRowCount(len(datas)) # 设置显示多少行,此处是根据表中的数据读取
self.tableView.setSortingEnabled(True) # 是否支持排序,如果是True, 则表头点击,可以进行排序的
for row, items in enumerate(datas):
for col, item in enumerate(items):
item_model = QStandardItem(str(item))
item_model.setToolTip(str(item)) # 鼠标放入单元格中,会提示,提示内容根据传入的值
item_model.setTextAlignment(Qt.AlignmentFlag.AlignCenter) # 设置表格的内容居中显示
font = item_model.font()
font.setPointSize(10) # 设置字体大小
item_model.setFont(font)
self.model.setItem(row, col, item_model) # 最重要的,在多少行,多少列,设置什么数据
细节调整
self._update_table_data() # 上面已经包含
vh = self.tableView.verticalHeader()
vh.setVisible(False) # 隐藏左侧的序号
# 只允许选择一行,不支持选择一行中的列
self.tableView.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
# 不能选择多行,只能选择一行
self.tableView.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)
# 最重要的,将tableview和model关联起来
self.tableView.setModel(self.model)
通过以上代码,我们就实现了TableView的展示数据的能力,只能展示肯定远远不够,如何进行修改/创建/删除呢?!
修改/创建/删除
对于新增,只需要写入数据库,并更新model
数据即可。
对于修改/删除如下:
# 选择被选择的行数据
selectedIndexes = self.tableView.selectedIndexes()
if selectedIndexes:
# 第一行,第一列的数据
topic = selectedIndexes[0].data()
rowToDelete = selectedIndexes[0].row() # 选择当前行数据
# 软件删除,不显示当前行,表格中不显示此行
self.model.removeRow(rowToDelete)
# 删除sqlite3中的数据
getWechatDb().del_data(topic)
展示
展示效果如下