python - riverbankcomputing - PyQt envía el parámetro a la ranura cuando se conecta a una señal
qt designer pyqt5 download (5)
Como ya se mencionó here , puede usar la función lambda para pasar argumentos adicionales al método que desea ejecutar.
En este ejemplo, puede pasar una cadena obj a la función AddControl () invocada cuando se presiona el botón.
# Create the build button with its caption
self.build_button = QPushButton(''&Build Greeting'', self)
# Connect the button''s clicked signal to AddControl
self.build_button.clicked.connect(lambda: self.AddControl(''fooData''))
def AddControl(self, name):
print name
Fuente: snip2code - Uso de la función Lambda para pasar argumentos adicionales en PyQt4
Tengo un menú de la barra de tareas que, al hacer clic, está conectado a una ranura que recibe el evento de activación. Ahora el problema es que quiero saber en qué elemento del menú se hizo clic, pero no sé cómo enviar esa información a la función conectada. Aquí está el usado para conectar la acción a la función:
QtCore.QObject.connect(menuAction, ''triggered()'', menuClickedFunc)
Sé que algunos eventos devuelven un valor, pero disparado () no lo hace. Entonces, ¿cómo puedo hacer que esto suceda? ¿Tengo que hacer mi propia señal?
En general, debe tener cada elemento de menú conectado a una ranura diferente, y hacer que cada ranura maneje la funcionalidad solo para su propio elemento de menú. Por ejemplo, si tiene elementos de menú como "guardar", "cerrar", "abrir", debe crear un espacio separado para cada uno, no intente tener un solo espacio con una declaración de caso.
Si no desea hacerlo de esta manera, puede usar la función QObject::sender() para obtener un puntero al remitente (es decir, el objeto que emitió la señal). Sin embargo, me gustaría escuchar un poco más sobre lo que estás tratando de lograr.
También me gustaría agregar que puede usar el método del sender
si solo necesita averiguar qué widget envió la señal. Por ejemplo:
def menuClickedFunc(self):
# The sender object:
sender = self.sender()
# The sender object''s name:
senderName = sender.objectName()
print senderName
Usa una lambda
Aquí hay un ejemplo del libro de PyQt :
self.connect(button3, SIGNAL("clicked()"),
lambda who="Three": self.anyButton(who))
Por cierto, también puedes usar functools.partial
, pero encuentro el método lambda
más simple y claro.
utilizar functools.partial
de lo contrario, encontrará que no puede pasar argumentos dinámicamente cuando se ejecuta el script, si usa lambda.