Python 为什么我需要用pyqtSlot装饰连接的插槽?
我使用的是pyqt5,我有几个方法使用类似以下代码连接:Python 为什么我需要用pyqtSlot装饰连接的插槽?,python,pyqt,signals-slots,pyqt5,Python,Pyqt,Signals Slots,Pyqt5,我使用的是pyqt5,我有几个方法使用类似以下代码连接: self.progress.canceled.connect(self.cancel) 其中,例如,self.cancel是: def cancel(self): self.timer.stop() 这段代码似乎在多个场景中都能很好地工作,从来没有用pyqtlot装饰cancel,也没有对它做任何特殊的处理 我的问题是: 这样做会让我失去什么 需要pyqtSlot的原因是什么 的主要目的是允许定义插槽的多个不同重载,每个重载具
self.progress.canceled.connect(self.cancel)
其中,例如,self.cancel
是:
def cancel(self):
self.timer.stop()
这段代码似乎在多个场景中都能很好地工作,从来没有用pyqtlot
装饰cancel
,也没有对它做任何特殊的处理
我的问题是:
pyqtSlot
。信号可以连接到任何python可调用对象,无论它是否装饰为插槽
PyQt文档还声明:
将一个信号连接到一个修饰过的Python方法还具有减少内存使用量的优点,并且速度稍快
然而,在实践中,这一优势通常非常小,并且经常会被其他因素所淹没。它对原始信号发送速度的影响很小,在它开始对cpu负载或内存使用产生重大影响之前,需要进行数千次发射/连接。要深入分析这些要点,请参阅@scholli的这篇代码项目文章:
pyqtSlot
。信号可以连接到任何python可调用对象,无论它是否装饰为插槽
PyQt文档还声明:
将一个信号连接到一个修饰过的Python方法还具有减少内存使用量的优点,并且速度稍快
然而,在实践中,这一优势通常非常小,并且经常会被其他因素所淹没。它对原始信号发送速度的影响很小,在它开始对cpu负载或内存使用产生重大影响之前,需要进行数千次发射/连接。要深入分析这些要点,请参阅@scholli的这篇代码项目文章:
信号/插槽编辑器
中选择由pyqtSlot
修饰的方法,否则您需要编写代码。另一个优点是当您为Qt designer设计自定义小部件时,通过pyqtlot
修饰的方法可以在Signal/Slot Editor
中选择,否则您需要编写代码。此外,(至少在PySide
中;不过,我认为PyQt
也是如此),如果您想跨线程发送信号数据,必须使用Slot修饰程序。@BrendanAbel。PySide或PyQt中的交叉线程信号都不需要它。唯一的例外是,如果在将对象移动到另一个线程之前连接了信号,但这只会影响PyQt。这就是我在上面的回答中提到的场景(请参阅以获得更完整的解释)。此外,(至少在PySide
中;尽管我认为PyQt
也是如此),如果要跨线程发送信号数据,必须使用插槽装饰器。@BrendanAbel。PySide或PyQt中的交叉线程信号都不需要它。唯一的例外是,如果在将对象移动到另一个线程之前连接了信号,但这只会影响PyQt。这就是我在上面的回答中提到的场景(请参阅以获得更完整的解释)。+1指出了这一点,但遗憾的是,您更受编辑的约束,而不是口译员的约束。。。奇怪的设计选择。这在您开发设计器插件时非常重要,用户可能不容易意识到未公开的功能。+1指出这一点,但遗憾的是,您受编辑器的约束比受解释器的约束更大。。。奇怪的设计选择。这在开发设计器插件时非常重要,用户可能不容易意识到未公开的功能。