Comment passer des arguments aux fonctions de rappel dans PyQt
Que j'ai autour de 10 QAction (ce nombre varie dans l'exécution) dans une barre d'outils, qui seront tous faire la même chose, mais avec des paramètres différents. Je pense à ajouter un paramètre comme un attribut de QAction objet, puis, QAction déclenchée du signal sera également envoyer de l'objet lui-même à la fonction de rappel, afin que je puisse obtenir les paramètres requis pour la fonction. En fait, j'ai 2 questions à ce sujet:
- Peut-il être fait?
- Est-il une meilleure manière de faire ceci?
OriginalL'auteur yasar | 2012-01-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez envoyer l'objet d'action lui-même à l'aide d'un signal mappeur. Cependant, il peut être préférable de simplement envoyer un identifiant et faire tout le travail dans le gestionnaire de signal.
Voici un simple script démo:
QSignalMapper
pas largement utilisé?Je ne sais pas pourquoi l'OP accepté cette réponse, étant donné que le plus classique de l'
lambda/partial
solution a déjà été donnée. Il était une fois une époque oùQSignalMapper
était plus utile, parce que PyQt n'a pas toujours pris en charge à l'aide delambda/partial
comme une fente, mais c'était il y a longtemps. Pour l'instant, je ne peux pas penser à un scénario où il pourrait être plus efficace (autres qu'en C++, bien sûr).OriginalL'auteur ekhumoro
Vous pouvez utiliser
functools.partielle
de standart bibliothèque Python. Exemple avecQAction
:OriginalL'auteur reclosedev
Vous pouvez utiliser une fonction lambda associé à l'interface graphique de contrôle de la fente pour passer des arguments supplémentaires à la méthode que vous souhaitez exécuter.
Source: snip2code - à l'Aide d'une Fonction Lambda De Passer en Argument Supplémentaire en PyQt4
OriginalL'auteur Dominique Terrs
Le meilleur moyen de passer des arguments est de ne pas les transmettre à tous. Vous pouvez utiliser le caractère dynamique de python, et l'ensemble de toutes les données, vous aurez besoin de vos propres propriétés sur les widgets eux-mêmes, obtenez le widget cible dans le gestionnaire à l'aide de
self.sender()
, puis obtenir ce que les propriétés dont vous avez besoin directement à partir du widget.Dans cet exemple, cinq boutons sont créés et de l'état est défini sur le bouton de widget comme
my_own_data
propriété:click_handler
ne peut pas être appelé en toute sécurité par rien d'autre que des boutons spécifiques qui lui sont connectés.D'accord; ajout d'une option paramètre de données, de sorte que
click_handler()
peuvent être utilisés dans un sens plus générique.OriginalL'auteur ccpizza
Il y a encore un bug dans la façon dont PyQt utilise QSignalMapper. J'ai découvert un travail autour de ici:
http://www.riverbankcomputing.com/pipermail/pyqt/2010-March/026113.html
Pour corriger l'répondu à la question apporter la modification suivante:
Ce qui était nécessaire pour la suite de la version de Python:
OriginalL'auteur John Wasinger