如何为QTableWidget的itemChanged槽函数正确传递参数?
问题根源
- 你将
itemChanged信号的绑定操作放在了按键事件中,每按一次回车键就会新增一次信号绑定,多次绑定后只要触发一次itemChanged就会执行多次changeParam函数 - 按下回车键时如果处于单元格编辑状态,按下回车本身就会提交编辑内容触发
itemChanged,刚绑定完信号立刻就被触发,就会出现「没修改内容也执行函数」的错觉 - 额外提醒:
changeParam的默认参数用了可变对象oldListValue = [],这是Python常见坑,多次调用会共享同一个列表对象,导致参数值异常
修正方案
- 把信号绑定移到类的初始化方法中,仅绑定一次
- 将
oldListValue改为实例属性存储,不需要通过partial传参,避免重复绑定问题 - 按键事件中仅负责更新
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
相关产品推荐
相关产品推荐

