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

如何为QTableWidget的itemChanged槽函数正确传递参数?

问题根源

  • 你将itemChanged信号的绑定操作放在了按键事件中,每按一次回车键就会新增一次信号绑定,多次绑定后只要触发一次itemChanged就会执行多次changeParam函数
  • 按下回车键时如果处于单元格编辑状态,按下回车本身就会提交编辑内容触发itemChanged,刚绑定完信号立刻就被触发,就会出现「没修改内容也执行函数」的错觉
  • 额外提醒:changeParam的默认参数用了可变对象oldListValue = [],这是Python常见坑,多次调用会共享同一个列表对象,导致参数值异常

修正方案

  1. 把信号绑定移到类的初始化方法中,仅绑定一次
  2. 将oldListValue改为实例属性存储,不需要通过partial传参,避免重复绑定问题
  3. 按键事件中仅负责更新oldListValue的当前值即可

修正后代码示例:

# 类的初始化方法里新增绑定
def __init__(self):
    # 保留你原来的初始化逻辑
    self.ui.edit_table.itemChanged.connect(self.changeParam)
    # 初始化实例属性存储旧值
    self.oldListValue = []

def KeyPressed(self,event):
    if event.key() == QtCore.Qt.Key_Return:
        # 按下回车时仅更新旧值列表,不做信号绑定
        self.oldListValue.clear()
        for i in range(0, 46):
            self.oldListValue.append(self.ui.edit_table.item(i, 1).text())
        print('Enter Key Pressed')

def changeParam(self):
    newListValue = []
    for i in range(0, 46):
        newListValue.append(self.ui.edit_table.item(i, 1).text())
    print(newListValue)
    print(self.oldListValue)
    for j in range(0,46):
        if newListValue[j] != self.oldListValue[j]:
            print("start serial write")
    newListValue.clear()

如果确实需要通过参数传递旧值,要保证每次绑定前先断开之前的绑定,避免重复绑定:

def KeyPressed(self,event):
    if event.key() == QtCore.Qt.Key_Return:
        oldListValue = []
        for i in range(0, 46):
            oldListValue.append(self.ui.edit_table.item(i, 1).text())
        print('Enter Key Pressed')
        # 先断开之前的绑定,避免重复绑定
        try:
            self.ui.edit_table.itemChanged.disconnect()
        except:
            pass
        self.ui.edit_table.itemChanged.connect(partial(self.changeParam,oldListValue))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:06:05