QTableWidget的itemChanged或cellChanged信号触发,在进入槽函数之后,如果槽函数中对QTableWidget的单元格执行了某些操作(如修改单元格内数据,修改单元格字体颜色等)都会再次触发itemChanged或cellChanged信号然后去执行槽函数,会陷入无限循环。
解决方案:
1. 阻塞方法blockSignals
在进入槽函数时,进入阻塞模式,这个对象发送的信号都会被阻塞;
在退出槽函数前,解除阻塞,重新接受对象发送的信号;
返回值为之前状态的阻塞情况。
# 进入槽函数
self.tableWidget.blockSignals(True) # 进入阻塞模式
'''执行相关槽函数程序'''
self.tableWidget.blockSignals(False) # 退出阻塞模式
# 退出槽函数
2. 断开信号槽方法disconnect
在进入槽函数时,断开信号槽;
在退出槽函数前,重新连接信号槽。
同阻塞方法类似。
# 进入槽函数:self.xxxxx
self.tableWidget.itemChanged.disconnect(self.xxxxx) # 断开信号槽
'''执行相关槽函数程序'''
self.tableWidget.itemChanged.connect(self.xxxxx) # 连接信号槽
# 退出槽函数:self.xxxxx