10
votes

Comment passer des arguments pour rappeler des fonctions dans Pyqt

J'ai environ 10 qaction (ce nombre variera en runtime) dans une barre d'outils, que tout va faire la même chose, mais en utilisant différents paramètres. Je pense que j'aimerais ajouter un paramètre en tant qu'attribut à l'objet qaction, puis, le signal déclenché de Qaction enverra également l'objet lui-même à la fonction de rappel, de sorte que je puisse obtenir des paramètres requis pour la fonction. J'ai en fait 2 questions à ce sujet:

  • peut-il être fait?
  • Y a-t-il une meilleure façon de faire cela?

0 commentaires

5 Réponses :


43
votes

Comment passer des arguments à des fonctions de rappel dans Pyqt

Vous pouvez utiliser FuncTools.Partial De Standart Python Bibliothèque. Exemple avec qaction : xxx


0 commentaires

4
votes

2 commentaires

Cette réponse ne semble pas très populaire. Est-ce que QsignalMapper n'est pas largement utilisé?


@figues. Je ne sais pas pourquoi l'OP a accepté cette réponse, étant donné que la solution plus conventionnelle lambda / partielle était déjà donnée. Il y avait une fois un moment où qsignalmapper était plus utile, car Pyqt n'a pas toujours pris en charge avec lambda / partiel comme emplacement - mais c'était il y a longtemps. Pour le moment, cependant, je ne peux pas penser à un scénario où il pourrait être plus efficace (autre que dans C ++, bien sûr).



1
votes

Il y a toujours un bogue dans la manière dont Pyqt utilise QsignalMapper. J'ai découvert un travail ici:

http: // www. RiverbankComputing.com/pipermarin/pyqt/2010-march/026113.html P>

Pour corriger la question répondue à la modification suivante: P>

Python 2.6.6 (r266:84292, Feb 21 2013, 19:26:11)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2


0 commentaires

11
votes

Vous pouvez utiliser une fonction Lambda associée au logement du contrôle de l'interface graphique pour passer des arguments supplémentaires à la méthode que vous souhaitez exécuter. XXX

Source: Snip2Code - Utilisation de la fonction Lambda pour réussir l'argument supplémentaire dans PYQT4


0 commentaires

4
votes

Le meilleur moyen de passer les arguments est de ne pas les transmettre du tout. Vous pouvez utiliser la nature dynamique de Python et définir toutes les données dont vous avez besoin comme vos propres propriétés sur les widgets eux-mêmes, obtenez le widget cible dans le gestionnaire à l'aide de Self.Sender () code>, puis obtenez toutes les propriétés Vous avez besoin directement du widget.

Dans cet exemple, cinq boutons sont créés et l'état requis est défini sur le widget de boutons comme my_own_data ​​code> Propriété: p>

import sys
from PyQt4 import QtGui, QtCore

class Main(QtGui.QMainWindow):

    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.centralwidget = QtGui.QWidget()
        self.vboxlayout = QtGui.QVBoxLayout()

        for idx in range(5):
            button = QtGui.QPushButton('button ' + str(idx), None)
            button.my_own_data = str(idx)  # <<< set your own property
            button.clicked.connect(self.click_handler)  # <<< no args needed
            self.vboxlayout.addWidget(button)

        self.centralwidget.setLayout(self.vboxlayout)
        self.setCentralWidget(self.centralwidget)
        self.show()

    def click_handler(self, data=None):
        if not data:
            target = self.sender()  # <<< get the event target, i.e. the button widget
            data = target.my_own_data  # <<< get your own property
        QtGui.QMessageBox.information(self, 
                                      "you clicked me!", 
                                      "my index is {0}".format(data))

app = QtGui.QApplication(sys.argv)
main = Main()
main.show()

sys.exit(app.exec_())