Подтвердить что ты не робот

Требуется ли украшатель слотов PySide?

Я видел пример кода для слотов 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.

4b9b3361

Ответ 1

Эта ссылка объясняет следующее о декораторе pyqtSlot:

Хотя PyQt4 позволяет использовать любой Python для использования в качестве слота, когда соединения, иногда необходимо явно отмечать Python как слот Qt и предоставить подпись С++ для Это. PyQt4 предоставляет декоратор функции pyqtSlot() для этого.

и

Подсоединение сигнала к декорированному методу Python также имеет преимущество уменьшения объема используемой памяти и немного быстрее.

Так как декоратор pyqtSlot может принимать дополнительные аргументы, такие как name, он позволяет различным методам Python обрабатывать разные сигнатуры сигнала.

Если вы не используете декоратор слота, механизм подключения сигнала должен вручную выработать все преобразования типов для сопоставления с базовыми сигнатурами функций С++ для функций Python. Когда используются декодеры слотов, сопоставление типов может быть явным.

Ответ 2

У Остина есть хороший ответ, и ответ, который я собираюсь написать, немного выходит за рамки вашего вопроса, но это то, что меня сбивало с толку, и я думаю, что другие будут на этой странице удивляться тому же.

Если вы хотите разоблачить методы Python для JavaScript (используя QTWebKit), то декоратор @pyqtSlot является обязательным. Undecorated методы не подвергаются JavaScript.