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

Nir*_*Izr 10 python pyqt signals-slots pyqt5

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

self.progress.canceled.connect(self.cancel)
Run Code Online (Sandbox Code Playgroud)

例如,在哪里self.cancel:

def cancel(self):
    self.timer.stop()
Run Code Online (Sandbox Code Playgroud)

此代码似乎在多个方案中干净利落地工作,而没有装饰cancelpyqtSlot或做什么特别的吧.

我的问题是:

  1. 通过这种方式我失去了什么?
  2. 需要什么原因pyqtSlot

ekh*_*oro 14

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

PyQt文档还说明:

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

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


Ton*_*ony 8

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