为什么我需要用pyqtSlot来装饰连接的插槽?

时间:2016-10-30 04:07:47

标签: python pyqt signals-slots pyqt5

我正在使用pyqt5,并且我使用类似于以下代码连接了几个方法:

self.progress.canceled.connect(self.cancel)

例如,self.cancel是:

def cancel(self):
    self.timer.stop()

此代码似乎可以在多种情况下干净利落地运行,而无需使用cancelpyqtSlot进行装饰或对其执行任何特殊操作。

我的问题是:

  1. 这样做会让我失去什么?
  2. 需要pyqtSlot的原因是什么?

2 个答案:

答案 0 :(得分:11)

pyqtSlot的主要目的是允许定义槽的几个不同重载,每个重载具有不同的签名。在进行跨线程连接时有时也可能需要它(对于一个这样的场景,请参见this answer)。但是,这些用例相对较少,在大多数PyQt应用程序中,根本不需要使用pyqtSlot。信号可以连接到任何python可调用对象,无论它是否被装饰为插槽。

PyQt文档还声明:

  

将信号连接到装饰的Python方法还具有减少使用的内存量的优势,并且速度稍快。

然而,在实践中,这种优势通常非常小,并且经常会被其他因素所淹没。它对原始信令速度的影响非常小,在开始对cpu负载或内存使用产生重大影响之前,有必要先使用数千的emits / connections。有关这些要点的深入分析,请参阅@Schollii撰写的Code Project文章:

答案 1 :(得分:0)

另一个优点是当你为Qt-designer设计自定义小部件时,可以在pyqtSlot中选择由Signal/Slot Editor装饰的方法,否则你需要编写代码。