PyQt, Qt, un gestionnaire d'événements de travail avec de nombreux articles
-
19-09-2019 - |
Question
J'ai deux ou trois cases à cocher sur ma forme, et je ne veux pas écrire gestionnaire d'événements séparés pour chacun, car ils ont tous exécuteront la même logique. Au lieu de cela, je veux écrire un seul gestionnaire d'événements qui saura à ce que la case a été cliqué.
par exemple. à Delphes je peux l'utiliser de cette façon:
function click_handler(sender):
begin
checked_box := sender.tag;
end;
Ici, je me souviens numéro de la case cochée dans une variable (propriété de balise a été définie manuellement dans Delphi IDE).
Je cherchai et ne peut pas trouver comment je peux mettre en œuvre cette aide de Qt, car les gestionnaires d'événements n'ont pas l'argument sender
.
Je mis en œuvre comme ça, mais ce n'est pas pratique:
# assign handlers (n assignments)
checkbox_1.clicked.connect(self.cb_1_click)
...
checkbox_<n>.clicked.connect(self.cb_<n>_click)
# separate handler for each check box (n functions, doing the same stupid work)
def cb_1_click:
self.cb_click(sender=1)
...
def cb_<n>_click:
self.cb_click(sender=n)
# main check box click logic (1 function)
def cb_click(sender):
# do something common for all checkboxes
Merci.
La solution
Vous pouvez utiliser QObject :: sender () dans les fentes pour savoir qui a émis le signal.
Aussi, vous pouvez consulter QSignalMapper qui vise précisément pour résoudre ces problèmes .