Question

J'ai un menu de la barre des tâches que lorsque vous cliquez dessus est connecté à une fente qui reçoit l'événement déclencheur. Maintenant, le problème est que je veux savoir quel élément de menu a été cliqué, mais je ne sais pas comment envoyer ces informations à la fonction connectée à. Voici le utilisé pour connecter l'action à la fonction:

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

Je sais que certains événements renvoient une valeur, mais déclenché () ne fonctionne pas. Alors, comment puis-je y arriver? Dois-je faire mon propre signal?

Était-ce utile?

La solution

Utilisez un lambda

Voici un exemple de la PyQt livre :

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

Par ailleurs, vous pouvez également utiliser functools.partial, mais je trouve la méthode lambda plus simple et plus claire.

Autres conseils

Comme déjà mentionné ici vous pouvez utiliser la fonction lambda pour passer des arguments supplémentaires à la méthode que vous voulez exécuter.

Dans cet exemple, vous pouvez passer une chaîne obj à la fonction AddControl () invoqué lorsque le bouton est enfoncé.

# 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

Source: snip2code - Utilisation de la fonction Lambda Pour passer Argument supplémentaire dans PyQt4

utiliser functools.partial

sinon vous trouverez vous ne pouvez pas passer des arguments dynamiquement quand le script est en cours d'exécution, si vous utilisez lambda.

En général, vous devriez avoir chaque élément de menu connecté à un autre emplacement, et ont chaque fente gérer la fonctionnalité uniquement pour son propre élément de menu. Par exemple, si vous avez des éléments de menu comme « enregistrer », « fermer », « ouvert », vous devez faire une fente séparée pour chacun, essayez de ne pas avoir une seule fente avec une déclaration de cas il.

Si vous ne voulez pas le faire de cette façon, vous pouvez utiliser le QObject :: sender () fonction pour obtenir un pointeur à l'expéditeur (ex: l'objet qui a émis le signal). J'aimerais entendre un peu plus sur ce que vous essayez d'accomplir, cependant.

Je voudrais aussi ajouter que vous pouvez utiliser la méthode sender si vous avez juste besoin de savoir ce que le signal envoyé de widgets. Par exemple:

def menuClickedFunc(self):
    # The sender object:
    sender = self.sender()
    # The sender object's name:
    senderName = sender.objectName()
    print senderName
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top