异步更新QTableWidget按下回车键无法获取单元格新值的问题
QTableWidget手动编辑后按回车无法获取新值的解决方法
问题场景
我有一个异步更新的QTableWidget,需要在手动修改单元格值并按下回车键后读取新值。但编写的按键事件捕获函数只能获取旧值——原因是按键事件触发时机早于单元格的新值更新。同时不能使用itemChanged().connect,因为表格还会被其他进程修改,仅需捕获手动编辑的内容。
原问题代码
def tableOnKeyPressEvent(self, event): if event.key() == Qt.Key.Key_Return or event.key() == Qt.Key.Key_Enter: for a in self.CmdtableWidget.selectedItems(): print(a.text()) # 仅输出旧值789,而非新输入的123 QTableWidget.keyPressEvent(self.CmdtableWidget, event) # 将按键事件传递给表格
解决方案
方法1:调整事件处理顺序
先让表格处理回车事件(完成新值到单元格的同步),再读取单元格内容:
def tableOnKeyPressEvent(self, event): if event.key() == Qt.Key.Key_Return or event.key() == Qt.Key.Key_Enter: # 先执行表格默认的回车事件处理,同步编辑器内容到单元格 QTableWidget.keyPressEvent(self.CmdtableWidget, event) # 此时读取单元格即为新值 for a in self.CmdtableWidget.selectedItems(): print(a.text()) # 输出新输入的123
方法2:直接获取编辑器内容
在触发回车时,直接读取当前单元格编辑器中的内容(此时新值还未同步到item):
def tableOnKeyPressEvent(self, event): if event.key() == Qt.Key.Key_Return or event.key() == Qt.Key.Key_Enter: # 获取当前编辑的单元格编辑器 current_row = self.CmdtableWidget.currentRow() current_col = self.CmdtableWidget.currentColumn() editor = self.CmdtableWidget.cellWidget(current_row, current_col) # 检查编辑器是否有text()方法(如QLineEdit) if editor and hasattr(editor, 'text'): print(editor.text()) # 直接获取新输入的值 # 再传递事件完成单元格更新 QTableWidget.keyPressEvent(self.CmdtableWidget, event)
原理说明
原代码中,回车事件的默认行为是将编辑器内的新值同步到QTableWidgetItem,但你先读取了item的text,此时同步还未完成,所以拿到旧值。调整顺序后,先让表格完成同步操作,再读取就能得到新值;方法二则是直接从编辑控件中取还未同步的内容,同样能拿到手动输入的新值。
内容的提问来源于stack exchange,提问作者Gifford47
相关产品推荐
相关产品推荐

