QTableWidget
使用数据改变信号量cellChange
发生死循环
首先说明,这个信号非常的坑,不得不承认我被这个信号恶心到了,只要连接这个信号,不管是你手动更改一个数据,或者是数据的初始化,总之只要表格有一点改变,这个信号就被发射,后果就是:想想没有结束条件的递归吧!
解决方法
其实和处理进程间的通信这类问题是一样的处理办法,我们需要给他加锁或者或设置原子操作
阻塞方法blockSignals
在使用程序进行表格的显示的时候,进入阻塞模式;完成后退出阻塞模式;在手动更改数据后,在我的程序中需要重新显示表格,所以再次自动阻塞,后退出阻塞,如此循环
但是从方法或许有问题:既然是阻塞信号,会不会和进程通信是一样的,信号等待临界区开放,或者即使不等待仍然会发送信号,花费时间,由于笔者没有使用此方法,烦请读者自行探索。
def 表格显示数据():
self.tableWidget.blockSignals(True) # 进入阻塞模式
'''执行程序'''
self.tableWidget.blockSignals(False) # 退出阻塞模式
# 退出槽函数
def 手动更改数据的函数():
# 进入槽函数
表格显示数据()
断开信号槽 disconnect
原理通上,只是在阻塞的地方我们使用的是disconnect
断开信号槽,这样不会出现我担心的上述问题。
不过需要注意的是,我们必须在初始化的时候先connect
信号槽,才有disconnect
的操作。
self.tableWidget.self.ShowPosition.cellChanged.connect(self.手动更改数据的函数) # 表格内容改变的信号量
def 表格显示数据():
self.ShowPosition.cellChanged.disconnect(self.手动更改数据的函数) # 进入阻塞模式
'''执行程序'''
self.tableWidget.self.ShowPosition.cellChanged.connect(self.手动更改数据的函数) # 退出阻塞模式
# 退出槽函数
def 手动更改数据的函数():
# 进入槽函数
表格显示数据()
下面贴一下我的部分代码,仅供参考:
self.ShowPosition.cellChanged.connect(self.positionChange) # 表格内容改变的信号量
def show_ui(self):
# 此处断开连接,类似于原子操作或互斥,在设置表格时不允许发出改变的信号;表格完成,需要手动更改时,再打开连接
self.ShowPosition.cellChanged.disconnect(self.positionChange)
xxx # 显示等操作
self.ShowPosition.cellChanged.connect(self.positionChange) # 打开连接
def positionChange(self):
xxx # 获取改变的数据
self.show_ui()