【问题标题】:Is the PySide Slot Decorator Necessary?PySide Slot Decorator 是必需的吗?
【发布时间】:2013-01-03 12:28:03
【问题描述】:

我已经看到了一些使用 @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 似乎也是如此。

【问题讨论】:

    标签: python pyqt pyside signals-slots


    【解决方案1】:

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

    虽然 PyQt4 允许任何 Python 可调用对象在以下情况下用作插槽 连接信号,有时需要明确标记 Python 方法作为 Qt 插槽并为 它。 PyQt4 提供了 pyqtSlot() 函数装饰器来做到这一点。

    将信号连接到修饰的 Python 方法也有 减少使用的内存量的优点,并且稍微 更快。

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

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

    【讨论】:

    • 感谢您简洁而完整的回答。我一直主要依赖 PySide 文档,因为那是我正在使用的库,但我看到了通过 PyQt 排序的优势。
    • 我不完全理解这个答案——如果我要定义自己的插槽(或为此覆盖内置插槽),为什么我需要 C++ 函数签名(没有C++ 函数...)?
    • @simon Qt 与信号/槽机制一起在 C++ 中实现,因此在某些时候,即使您定义自己的信号/槽,它们也会遍历底层 C++ 实现。
    • @AustinPhillips Pyside 中 Qt 插槽与非 Qt 插槽的区别是什么?我永远不确定那是什么意思。此外,当使用新型信号和插槽时,我们是否真的在 PySide 中提供了 C++ 签名(正如 Jason 在上面的示例中所做的那样)?另外我有一个使用“发件人”的插槽,当我尝试将@QtCore.Slot() 放在定义之前,该插槽不起作用。因此,添加装饰器似乎不是一件好事。
    • 刚刚找到这个帖子:stackoverflow.com/questions/18015684/…
    【解决方案2】:

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

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

    【讨论】:

    • 嗯,这是一个更好的答案,至少它告诉我们什么时候是强制性的。
    • @QtCore.Slot() for pyside2
    【解决方案3】:

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

    Derived classes receiving signals in wrong thread in PySide (Qt/PyQt)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2020-10-09
      • 1970-01-01
      相关资源
      最近更新 更多