¿Por qué necesito decorar las ranuras conectadas con pyqtSlot?

Estoy usando pyqt5, y tengo varios métodos conectados usando un código similar al siguiente:

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

Donde, por ejemplo, self.cancel es:

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

Este código parece funcionar limpiamente en múltiples escenarios, sin decorar nunca cancel con pyqtSlot o hacer nada especial con él.

Mis preguntas son:

  1. ¿Qué estoy perdiendo al hacerlo de esta manera?
  2. ¿Cuál es la razón pyqtSlot se requiere pyqtSlot ?

El propósito principal de pyqtSlot es permitir que se pyqtSlot varias sobrecargas diferentes de una ranura, cada una con una firma diferente. También puede ser necesario a veces al hacer conexiones entre hilos (consulte esta respuesta para uno de estos escenarios). Sin embargo, estos casos de uso son relativamente raros, y en la mayoría de las aplicaciones PyQt no es necesario usar pyqtSlot en absoluto. Las señales se pueden conectar a cualquier objeto de Python, ya sea que esté decorado como una ranura o no.

Los documentos de PyQt también establecen:

Conectar una señal a un método Python decorado también tiene la ventaja de reducir la cantidad de memoria utilizada y es un poco más rápido.

Sin embargo, en la práctica, esta ventaja es generalmente muy pequeña y, a menudo, se verá abrumada por otros factores. Tiene muy poco efecto en la velocidad de señalización sin formato, y sería necesario realizar miles de emisiones / conexiones antes de que comenzara a tener un impacto significativo en la carga de la CPU o el uso de la memoria. Para un análisis en profundidad de estos puntos, vea este artículo del Proyecto de Código por @Schollii:

  • Señal PyQt5 rendimiento de conexión de ranura

Otra ventaja es que al diseñar los widgets personalizados para Qt-designer, los métodos decorados por pyqtSlot podrían seleccionarse en Signal/Slot Editor , de lo contrario, debe escribir el código.