Domanda

Ho un menu della barra delle applicazioni che se cliccato è collegato a uno slot che riceve l'evento di trigger. Ora il problema è che voglio sapere quale voce di menu è stato fatto clic, ma non so come inviare tali informazioni per la funzione collegata al. Qui è la utilizzato per collegare l'azione alla funzione:

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

So che alcuni eventi restituiscono un valore, ma innescato () non. Allora, come faccio a fare questo accadere? Devo fare il mio segnale?

È stato utile?

Soluzione

Usa un lambda

Ecco un esempio dalla PyQt libro :

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

Tra l'altro, è anche possibile utilizzare functools.partial, ma trovare il metodo lambda più semplice e chiaro.

Altri suggerimenti

Come già accennato qui è possibile utilizzare la funzione lambda per passare argomenti extra per il metodo che si desidera eseguire.

In questo esempio è possibile passare una stringa obj alla funzione AddControl () invocato quando si preme il pulsante.

# 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

Fonte: snip2code - Utilizzo Lambda Funzione Per passare argomento extra in PyQt4

utilizzare functools.partial

altrimenti troverete non è possibile passare gli argomenti in modo dinamico quando lo script è in esecuzione, se si utilizza lambda.

In generale, si dovrebbe avere ogni voce di menu collegata ad un altro slot, e hanno ogni slot gestire la funzionalità solo per essa la propria voce di menu. Ad esempio, se si dispone di voci di menu come "salvare", "vicino", "aperto", si dovrebbe fare uno slot separato per ciascuno, non cercare di avere un singolo slot con un'istruzione case in esso.

Se non si vuole fare in questo modo, è possibile utilizzare la QObject :: mittente () funzione per ottenere un puntatore al mittente (cioè: l'oggetto che ha emesso il segnale). Mi piacerebbe sentire un po 'di più su quello che stai cercando di realizzare, però.

Vorrei anche aggiungere che è possibile utilizzare il metodo sender se avete solo bisogno di scoprire che cosa widget inviato il segnale. Ad esempio:

def menuClickedFunc(self):
    # The sender object:
    sender = self.sender()
    # The sender object's name:
    senderName = sender.objectName()
    print senderName
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top