我使用的是 pyqt5,我有几个方法使用类似于以下的代码连接:
self.progress.canceled.connect(self.cancel)
例如,self.cancel
是:
def cancel(self):
self.timer.stop()
此代码似乎在多种情况下都能正常工作,无需使用 pyqtSlot
修饰 cancel
或对其进行任何特殊操作。
我的问题是:
- 这样做我会失去什么?
- 需要
pyqtSlot
的原因是什么?
最佳答案
pyqtSlot
的主要目的|是允许定义多个不同的插槽重载,每个重载都有不同的签名。有时在进行跨线程连接时也可能需要它(参见 this answer 了解其中一种情况)。然而,这些用例相对较少,在大多数 PyQt 应用程序中根本没有必要使用 pyqtSlot
。信号可以连接到任何 python 可调用对象,无论它是否装饰为插槽。
PyQt 文档还声明:
Connecting a signal to a decorated Python method also has the advantage of reducing the amount of memory used and is slightly faster.
然而,在实践中,这种优势通常很小,而且往往会被其他因素淹没。它对原始信号速度的影响很小,并且在它开始对 cpu 负载或内存使用产生重大影响之前,有必要进行 数千 的发射/连接。有关这些要点的深入分析,请参阅@Schollii 撰写的这篇代码项目文章:
关于python - 为什么我需要用pyqtSlot装饰连接的插槽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40325953/