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

标签 python pyqt signals-slots pyqt5

我使用的是 pyqt5,我有几个方法使用类似于以下的代码连接:

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

例如,self.cancel 是:

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

此代码似乎在多种情况下都能正常工作,无需使用 pyqtSlot 修饰 cancel 或对其进行任何特殊操作。

我的问题是:

  1. 这样做我会失去什么?
  2. 需要 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/

相关文章:

python - 使用 QT 示例的 PyQt5.Qt3DCore 中的回调机制有什么问题

python - 关闭 PyQt 对话框会终止父进程吗? (PyQt4/Pyside) 和示例代码

python - PyQt5:线程中的计时器

python - gzip 压缩文件的 pandas read_csv 不会推断数字列类型

python 2.7 : how to find the index of the first letter of each word in a string

python - PyCharm 中 Python 调试时如何单步执行 import 语句?

python - PySide:从另一个线程更新 GUI 的更简单方法

python - 统一打印某个数的倍数

c++ - 如何在 QML 中创建 Q_GADGET 结构的新实例?

c++ - 可视化 QT 信号和槽