You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5 QTableWidget点击保存按钮后编辑内容回退不保存问题

问题根因

内容回退的核心是数据没有同步:

  • 编辑状态下,你放在单元格里的QLineEdit是独立控件,用户输入的内容只保存在这个输入框实例里,从来没有写回对应的QTableWidgetItem对象
  • 点击SAVE时,你的代码读取的是tableWidget.item(roww, col).text(),这个值一直是初始加载的原始数据,根本没有拿到用户修改后的新内容,用原始值创建新的禁用输入框替换上去,自然会显示回旧值。

另外你反复给self.ui.btn_sell赋值新控件的写法会造成控件引用混乱、内存泄漏,不建议这么写。

修复代码

你只需要在替换控件前,先把当前输入框里的用户输入同步回QTableWidgetItem即可,修复后的ButtonSaveClicked实现如下:

def ButtonSaveClicked(self):
    click_btn = self.sender()
    roww = int((click_btn.text().split())[1]) - 1

    # 逐列处理数据单元格
    for col in range(3):
        # 取当前单元格内正在编辑的QLineEdit
        active_input = self.ui.tableWidget.cellWidget(roww, col)
        # 读取用户修改后的内容
        new_content = active_input.text()
        # 核心步骤:把修改后的内容同步回QTableWidgetItem,避免数据丢失
        self.ui.tableWidget.item(roww, col).setText(new_content)
        # 替换为禁用状态的输入框
        disabled_input = QtWidgets.QLineEdit(new_content)
        disabled_input.setEnabled(False)
        self.ui.tableWidget.setCellWidget(roww, col, disabled_input)

    # 换回Edit按钮
    edit_btn = QtWidgets.QPushButton(f"Edit {roww + 1}")
    edit_btn.clicked.connect(self.ButtonEditClicked)
    self.ui.tableWidget.setCellWidget(roww, 3, edit_btn)
优化建议
  • 你之前提到直接给单元格设置EDITABLE=True不生效,本质是没有正确操作Item的flag:正常场景下不需要额外嵌入QLineEdit实现编辑,直接通过item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)切换可编辑状态即可,编辑后的内容会自动存在Item中,不会出现数据不同步的问题,代码量能减少一半以上。
  • 不要靠解析按钮文本获取行号,这种写法容错率极低,后续改按钮文案就会直接报错。可以在创建按钮时通过btn.setProperty("row", roww)绑定行号,点击时通过self.sender().property("row")读取,稳定性高很多。

内容的提问来源于stack exchange,提问作者Alexandrs Grind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:27:09