Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我需要用pyqtSlot装饰连接的插槽?_Python_Pyqt_Signals Slots_Pyqt5 - Fatal编程技术网

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

Python 为什么我需要用pyqtSlot装饰连接的插槽?,python,pyqt,signals-slots,pyqt5,Python,Pyqt,Signals Slots,Pyqt5,我使用的是pyqt5,我有几个方法使用类似以下代码连接: self.progress.canceled.connect(self.cancel) 其中,例如,self.cancel是: def cancel(self): self.timer.stop() 这段代码似乎在多个场景中都能很好地工作,从来没有用pyqtlot装饰cancel,也没有对它做任何特殊的处理 我的问题是: 这样做会让我失去什么 需要pyqtSlot的原因是什么 的主要目的是允许定义插槽的多个不同重载,每个重载具

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

self.progress.canceled.connect(self.cancel)
其中,例如,
self.cancel
是:

def cancel(self):
    self.timer.stop()
这段代码似乎在多个场景中都能很好地工作,从来没有用
pyqtlot
装饰
cancel
,也没有对它做任何特殊的处理

我的问题是:

  • 这样做会让我失去什么
  • 需要pyqtSlot的原因是什么
  • 的主要目的是允许定义插槽的多个不同重载,每个重载具有不同的签名。有时在进行跨线程连接时也可能需要它(请参阅以了解其中一种情况)。然而,这些用例相对较少,在大多数PyQt应用程序中根本不需要使用
    pyqtSlot
    。信号可以连接到任何python可调用对象,无论它是否装饰为插槽

    PyQt文档还声明:

    将一个信号连接到一个修饰过的Python方法还具有减少内存使用量的优点,并且速度稍快

    然而,在实践中,这一优势通常非常小,并且经常会被其他因素所淹没。它对原始信号发送速度的影响很小,在它开始对cpu负载或内存使用产生重大影响之前,需要进行数千次发射/连接。要深入分析这些要点,请参阅@scholli的这篇代码项目文章:

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

    PyQt文档还声明:

    将一个信号连接到一个修饰过的Python方法还具有减少内存使用量的优点,并且速度稍快

    然而,在实践中,这一优势通常非常小,并且经常会被其他因素所淹没。它对原始信号发送速度的影响很小,在它开始对cpu负载或内存使用产生重大影响之前,需要进行数千次发射/连接。要深入分析这些要点,请参阅@scholli的这篇代码项目文章:


    另一个优点是,当您为Qt designer设计自定义小部件时,可以在
    信号/插槽编辑器
    中选择由
    pyqtSlot
    修饰的方法,否则您需要编写代码。

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

    此外,(至少在
    PySide
    中;不过,我认为
    PyQt
    也是如此),如果您想跨线程发送信号数据,必须使用Slot修饰程序。@BrendanAbel。PySide或PyQt中的交叉线程信号都不需要它。唯一的例外是,如果在将对象移动到另一个线程之前连接了信号,但这只会影响PyQt。这就是我在上面的回答中提到的场景(请参阅以获得更完整的解释)。此外,(至少在
    PySide
    中;尽管我认为
    PyQt
    也是如此),如果要跨线程发送信号数据,必须使用插槽装饰器。@BrendanAbel。PySide或PyQt中的交叉线程信号都不需要它。唯一的例外是,如果在将对象移动到另一个线程之前连接了信号,但这只会影响PyQt。这就是我在上面的回答中提到的场景(请参阅以获得更完整的解释)。+1指出了这一点,但遗憾的是,您更受编辑的约束,而不是口译员的约束。。。奇怪的设计选择。这在您开发设计器插件时非常重要,用户可能不容易意识到未公开的功能。+1指出这一点,但遗憾的是,您受编辑器的约束比受解释器的约束更大。。。奇怪的设计选择。这在开发设计器插件时非常重要,用户可能不容易意识到未公开的功能。