python - pyqtsignal - ¿Es necesario el decorador de ranuras PySide?
custom signal pyqt (3)
Austin tiene una buena respuesta, y la respuesta que estoy a punto de escribir está un poco fuera del alcance de su pregunta, pero es algo que me ha estado confundiendo e imagino que otros terminarán en esta página preguntándose lo mismo.
Si desea exponer los métodos de Python a JavaScript (utilizando QTWebKit) , el decorador @pyqtSlot
es obligatorio. Los métodos no decorados no están expuestos a JavaScript.
He visto un código de ejemplo para las ranuras PySide que usa el decorador @ QtCore.Slot, y algunas que no. Probándolo yo mismo, no parece hacer la diferencia. ¿Hay alguna razón por la que debería o no debería usarlo? Por ejemplo, en el siguiente código:
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()
el decorador @ QtCore.Slot no hace diferencia; Puedo omitirlo, llamar a @ QtCore.Slot (str), o incluso a @ QtCore.Slot (int), y todavía dice muy bien, "Hola".
Lo mismo parece ser cierto para PyQt''s pyqtSlot.
En un entorno multiproceso, puede ser obligatorio no utilizar el decorador de Slots pyside, ya que puede hacer que las señales lleguen al hilo equivocado. Ver
Las clases derivadas reciben señales en el hilo incorrecto en PySide (Qt / PyQt)
Este enlace explica lo siguiente sobre el decorador pyqtSlot
:
Aunque PyQt4 permite que cualquier Python llamable se use como una ranura cuando se conectan señales, a veces es necesario marcar explícitamente un método Python como una ranura Qt y proporcionarle una firma C ++. PyQt4 proporciona el decorador de función pyqtSlot () para hacer esto.
y
Conectar una señal a un método decorado de Python también tiene la ventaja de reducir la cantidad de memoria utilizada y es un poco más rápido.
Como el decorador pyqtSlot
puede tomar argumentos adicionales como el name
, permite que diferentes métodos de Python manejen las diferentes firmas de una señal.
Si no usa el decorador de tragamonedas, el mecanismo de conexión de señales debe resolver manualmente todas las conversiones de tipos para mapear desde las firmas de función de C ++ subyacentes hasta las funciones de Python. Cuando se usan los decoradores de tragamonedas, la asignación de tipos puede ser explícita.