41

我已经看到了一些使用 @QtCore.Slot 装饰器的 PySide 插槽示例代码,而有些则没有。自己测试了一下,好像没什么区别。我有理由应该或不应该使用它吗?例如,在以下代码中:

import sys
from PySide import QtCore

# the next line seems to make no difference
@QtCore.Slot()
def a_slot(s):
    print s

class SomeClass(QtCore.QObject):
    happened = QtCore.Signal(str)
    def __init__(self):
        QtCore.QObject.__init__(self)
    def do_signal(self):
        self.happened.emit("Hi.")

sc = SomeClass()
sc.happened.connect(a_slot)
sc.do_signal()

@QtCore.Slot 装饰器没有区别;我可以省略它,调用@QtCore.Slot(str),甚至调用@QtCore.Slot(int),它仍然很好地说,“嗨”。

PyQt 的 pyqtSlot 似乎也是如此。

4

3 回答 3

63

链接解释了有关pyqtSlot装饰器的以下内容:

尽管 PyQt4 允许在连接信号时将任何 Python 可调用对象用作插槽,但有时需要将 Python 方法显式标记为 Qt 插槽并为其提供 C++ 签名。PyQt4 提供了 pyqtSlot() 函数装饰器来执行此操作。

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

由于pyqtSlot装饰器可以采用额外的参数,例如name,它允许不同的 Python 方法处理信号的不同签名。

如果您不使用 slot 装饰器,则信号连接机制必须手动完成所有类型转换,以从底层 C++ 函数签名映射到 Python 函数。当使用插槽装饰器时,类型映射可以是显式的。

于 2013-01-21T02:13:54.090 回答
11

奥斯汀有一个很好的答案,我要写的答案有点超出你的问题范围,但这让我感到困惑,我想其他人最终会在这个页面上想同样的事情。

如果您想将 Python 方法公开给 JavaScript(使用 QTWebKit),那么@pyqtSlot装饰器是必需的。未修饰的方法不会暴露给 JavaScript。

于 2015-01-31T16:03:02.927 回答
7

在多线程环境中,可能强制不使用 pyside Slot 装饰器,因为它可能导致信号转到错误的线程。看

派生类在 PySide (Qt/PyQt) 的错误线程中接收信号

https://bugreports.qt.io/browse/PYSIDE-249

于 2015-12-15T17:47:01.403 回答