是PySide插槽装饰有必要吗?(Is the PySide Slot Decorator Nece

2019-07-18 10:36发布

我已经看到了PySide插槽,使用@ QtCore.Slot装饰也不至于一些示例代码,以及一些。 测试它自己,它似乎不有所作为。 是否有一个原因,我应该或不应该使用它呢? 例如,在下面的代码:

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如此。

Answer 1:

此链接介绍有关以下pyqtSlot装饰:

虽然PyQt4中允许可调用连接信号时,被用作时隙任何Python中,有时需要显式地标记一个Python方法作为一个Qt槽,并为它提供一个C ++签名。 PyQt4中提供pyqtSlot()函数装饰做到这一点。

连接信号到装饰的Python方法还具有减少的存储器使用量的优点,并且是稍快。

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

如果你不使用的插槽装饰,信号连接装置必须手动制定出所有类型转换,从底层C ++函数签名的Python函数映射。 当使用时隙装饰,类型映射可以是显式的。



Answer 2:

奥斯汀有一个很好的答案,我要写答案是你的问题的范围之外了一点,但它的东西,一直困惑我和我想象其他人会落得如此页知道同样的事情上。

如果您想公开Python方法给JavaScript(使用QtWebKit的),那么@pyqtSlot装饰是强制性的。 未修饰的方法不暴露给JavaScript。



Answer 3:

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

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

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



文章来源: Is the PySide Slot Decorator Necessary?