我正在使用pyqt5,并且我使用类似于以下代码连接了几个方法:
self.progress.canceled.connect(self.cancel)
例如,self.cancel
是:
def cancel(self):
self.timer.stop()
此代码似乎可以在多种情况下干净利落地运行,而无需使用cancel
对pyqtSlot
进行装饰或对其执行任何特殊操作。
我的问题是:
pyqtSlot
的原因是什么?答案 0 :(得分:11)
pyqtSlot
的主要目的是允许定义槽的几个不同重载,每个重载具有不同的签名。在进行跨线程连接时有时也可能需要它(对于一个这样的场景,请参见this answer)。但是,这些用例相对较少,在大多数PyQt应用程序中,根本不需要使用pyqtSlot
。信号可以连接到任何python可调用对象,无论它是否被装饰为插槽。
PyQt文档还声明:
将信号连接到装饰的Python方法还具有减少使用的内存量的优势,并且速度稍快。
然而,在实践中,这种优势通常非常小,并且经常会被其他因素所淹没。它对原始信令速度的影响非常小,在开始对cpu负载或内存使用产生重大影响之前,有必要先使用数千的emits / connections。有关这些要点的深入分析,请参阅@Schollii撰写的Code Project文章:
答案 1 :(得分:0)
另一个优点是当你为Qt-designer设计自定义小部件时,可以在pyqtSlot
中选择由Signal/Slot Editor
装饰的方法,否则你需要编写代码。