2016-10-30 2 views
3

Я использую pyqt5, и я несколько методов связан с использованием кода, подобный следующему:Зачем нужно украшать подключенные слоты с pyqtSlot?

self.progress.canceled.connect(self.cancel) 

Где, например, self.cancel является:

def cancel(self): 
    self.timer.stop() 

Этот код, кажется, работает чисто в несколько сценариев, не украшая cancel с помощью pyqtSlot или ничего особенного с ним делать.

Мои вопросы:

  1. Что я теряю, делая это таким образом?
  2. По какой причине требуется pyqtSlot?

ответ

6

Основная цель pyqtSlot состоит в том, чтобы разрешить несколько разных перегрузок слота, каждый из которых имеет другую подпись. Иногда это может потребоваться при создании соединений с поперечными потоками (см. this answer для одного такого сценария). Однако эти варианты использования относительно редки, и в большинстве приложений PyQt нет необходимости использовать pyqtSlot. Сигналы могут быть подключены к любому вызываемому python объекту, независимо от того, украшен ли он слотом или нет.

В PyQt документы также состояние:

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

Однако на практике это преимущество, как правило, очень мало и часто может затухать другими факторами. Это очень мало влияет на скорость передачи необработанных сигналов, и необходимо было бы сделать тысяч излучений/соединений, прежде чем оно начнет оказывать существенное влияние на загрузку процессора или использование памяти. Для в глубокий анализ этих точек, в этой статье код проекта по @Schollii:

+0

Кроме того, (по крайней мере, в 'PySide', хотя, я думаю, что это верно в' PyQt' а также), вы * должны * использовать декоратор слота, если хотите отправлять данные сигнала по потокам. –

+0

@BrendanAbel. Это не требуется для сигналов поперечной нити в PySide или PyQt. Единственным исключением из этого является то, что сигнал подключен * до * перемещения объекта на другой поток, но это влияет только на PyQt. Это сценарий, который я упомянул в моем ответе выше (см. [Этот другой ответ] (http://stackoverflow.com/a/20818401/984421) для более полного объяснения). – ekhumoro

Смежные вопросы