Pregunta

Tengo un menú de la barra de tareas que al hacer clic se conecta a una ranura que recibe el evento de disparo. Ahora el problema es que yo quiero saber qué elemento de menú se ha hecho clic, pero no sé cómo enviar esa información a la función de conectarse. Aquí está el utilizado para conectar la acción de la función:

QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)

Sé que algunos eventos devuelven un valor, pero activada () no. Entonces, ¿cómo puedo hacer que esto suceda? ¿Tengo que hacer mi propia señal?

¿Fue útil?

Solución

Utilice un lambda

Este es un ejemplo de la PyQt libro :

self.connect(button3, SIGNAL("clicked()"),
    lambda who="Three": self.anyButton(who))

Por cierto, también se puede utilizar functools.partial, pero encontrar el método más sencillo y claro lambda.

Otros consejos

Como ya se ha mencionado aquí puede utilizar la función lambda para pasar argumentos adicionales para el método que desea ejecutar.

En este ejemplo, usted puede pasar una cadena obj a la AddControl función () invoca 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 - Utilizar la función de Lambda para que apruebe argumento extra en PyQt4

utilizar functools.partial

de lo contrario se encuentra que no puede pasar argumentos de forma dinámica cuando se ejecuta un script, si utiliza lambda.

En general, usted debe tener cada elemento del menú conectado a una ranura diferente, y tienen cada ranura manejar la funcionalidad sólo para su propio elemento de menú. Por ejemplo, si tiene elementos de menú como "salvar", "cerrar", "abierto", usted debe hacer una ranura separada para cada uno, no se trata de tener una sola ranura con una declaración de caso en ella.

Si no desea hacerlo de esa manera, se podría utilizar el QObject :: remitente () función para obtener un puntero al remitente (es decir: el objeto que emite la señal). Me gustaría saber un poco más sobre lo que estamos tratando de lograr, sin embargo.

También me gustaría añadir que se puede utilizar el método sender si sólo tiene que averiguar lo widget de la señal enviada. Por ejemplo:

def menuClickedFunc(self):
    # The sender object:
    sender = self.sender()
    # The sender object's name:
    senderName = sender.objectName()
    print senderName
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top