PySide2 QTableWidget按下Enter键无法实时获取单元格最新文本问题
问题成因
- 你重写的
keyPressEvent回调触发时机早于QTableWidget原生的编辑提交逻辑:当单元格处于编辑状态时按下回车键,你的自定义处理函数会优先执行,此时编辑框内输入的新值还没有被提交同步到对应的QTableWidgetItem对象中,读取到的自然是修改前的旧值。 - 代码中调用
setEditTriggers的操作无法触发当前编辑内容的提交,也不会终止当前的编辑状态,对取值逻辑没有帮助。 - 第二次按下回车键时,单元格已经退出编辑状态、新值已经完成同步,因此可以读取到最新内容。
修复方案
有两种常用的修复方式,任选其一即可:
- 先执行父类原生的按键处理逻辑,完成内容提交后再执行自定义取值逻辑
def KeyPressed(self, event): # 先触发QTableWidget默认的按键处理,完成编辑内容提交 QtWidgets.QTableWidget.keyPressEvent(self.ui.edit_table, event) if event.key() == QtCore.Qt.Key_Return: print('Enter Key Pressed') print(self.ui.edit_table.item(0, 1).text()) newListValues = [] for i in range(0, 46): newListValues.append(self.ui.edit_table.item(i, 1).text()) print(newListValues) newListValues.clear()
- 取值前主动提交当前编辑的内容到对应单元格
def KeyPressed(self, event): if event.key() == QtCore.Qt.Key_Return: # 主动提交当前编辑器内容并关闭编辑状态 if self.ui.edit_table.state() == QtWidgets.QAbstractItemView.EditingState: editor = self.ui.edit_table.currentIndex().widget() self.ui.edit_table.commitData(editor) self.ui.edit_table.closeEditor(editor, QtWidgets.QAbstractItemDelegate.NoHint) print('Enter Key Pressed') print(self.ui.edit_table.item(0, 1).text()) newListValues = [] for i in range(0, 46): newListValues.append(self.ui.edit_table.item(i, 1).text()) print(newListValues) newListValues.clear()
内容的提问来源于stack exchange,提问作者gogogo
相关产品推荐
相关产品推荐

