PyQt5 QRunnable多线程信号多次触发问题咨询
问题核心诱因
- 你将
Signals实例定义为了ScrubWorker的类属性,而非实例属性。PyQt的信号对象作为类属性时,所有类实例会共享同一个信号实例,你每创建一个Worker就调用一次connect绑定槽函数,相当于给同一个信号重复叠加绑定了N次槽,每次任意一个Worker触发信号,所有之前绑定的槽都会被触发,自然就会出现结果重复打印、触发次数和Worker实例数量正相关的异常。 - 补充:你定义的类属性
number = []也属于不规范写法,不过__init__中你主动赋值了self.number覆盖了类属性,所以不会引发问题,但建议一并删除避免后续误操作。
修复方案
只需要把信号的定义放到__init__方法中,改为每个实例持有独立的信号对象即可:
class ScrubWorker(QRunnable): def __init__(self, number, *args, **kwargs): super(ScrubWorker, self).__init__(*args, **kwargs) self.signals = Signals() # 信号改为实例属性,每个Worker独有 self.number = number def run(self): self.signals.results.emit(self.number[0]) # QRunnable默认开启autoDelete,不需要手动调用,保留也无影响
如果修复后还是偶发重复触发,可以在connect时加上Qt.UniqueConnection参数,避免同一个信号和槽被重复绑定:
workers[row[0]].signals.results.connect(self.get_results, QtCore.Qt.UniqueConnection)
内容的提问来源于stack exchange,提问作者Sparky
相关产品推荐
相关产品推荐

