PyQt5自定义模型下QTableView设置editTriggers后仍无法编辑
问题根因
你自定义的QAbstractTableModel子类缺少编辑功能必需的两个核心实现,就算给QTableView设置了AllEditTriggers,模型本身不支持编辑也无法触发编辑操作:
- 没有重写
flags()方法:默认返回的项标志不包含Qt.ItemIsEditable属性,表格项会被判定为不可编辑 - 没有重写
setData()方法:缺少将用户编辑后的内容同步到内部数据源的逻辑,也没有发射更新信号通知视图刷新 - 额外注意:
data()方法需要同时支持Qt.EditRole返回值,否则编辑框打开时会显示空白
修复步骤
1. 在自定义TableModel类中添加flags方法
给所有表格项增加可编辑属性:
def flags(self, index): return Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable
2. 在自定义TableModel类中添加setData方法
实现数据更新逻辑,修改成功后发射dataChanged信号:
def setData(self, index, value, role): if role == Qt.EditRole: # 因为示例数据源是整数,这里做类型转换,可根据业务需求调整 self._data[index.row()][index.column()] = int(value) self.dataChanged.emit(index, index) return True return False
修复后完整可运行代码
import sys from PyQt5 import QtCore, QtWidgets from PyQt5.QtCore import Qt class TableModel(QtCore.QAbstractTableModel): def __init__(self, data): super(TableModel, self).__init__() self._data = data def data(self, index, role): # 新增EditRole支持,保证编辑框默认显示原有值 if role == Qt.DisplayRole or role == Qt.EditRole: return self._data[index.row()][index.column()] def rowCount(self, index): return len(self._data) def columnCount(self, index): return len(self._data[0]) # 新增:设置项可编辑 def flags(self, index): return Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable # 新增:处理编辑后的数据更新 def setData(self, index, value, role): if role == Qt.EditRole: self._data[index.row()][index.column()] = int(value) self.dataChanged.emit(index, index) return True return False app = QtWidgets.QApplication(sys.argv) table = QtWidgets.QTableView() # 可根据需要放开下面的编辑触发器设置 # table.setEditTriggers(QtWidgets.QAbstractItemView.AllEditTriggers) table.move(200,200) table.setFixedSize(500,300) data = [ [3, 5, 2], [1, 0, 0], [3, 8, 0], [3, 3, 2], [7, 8, 9], ] model = TableModel(data) table.setModel(model) table.show() app.exec_()
内容的提问来源于stack exchange,提问作者data analytics
相关产品推荐
相关产品推荐

