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: p>
5 Réponses :
Comment passer des arguments à des fonctions de rappel dans Pyqt P>
Vous pouvez utiliser
FuncTools.Partial Code> A > De Standart Python Bibliothèque. Exemple avec
qaction code>: p>
xxx pré> blockquote>
Cette réponse ne semble pas très populaire. Est-ce que QsignalMapper code> 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 code> était déjà donnée. Il y avait une fois un moment où
qsignalmapper code> était plus utile, car Pyqt n'a pas toujours pris en charge avec
lambda / partiel code> 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).
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
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. Source: Snip2Code - Utilisation de la fonction Lambda pour réussir l'argument supplémentaire dans PYQT4 P> P>
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 Dans cet exemple, cinq boutons sont créés et l'état requis est défini sur le widget de boutons comme Self.Sender () code>, puis obtenez toutes les propriétés Vous avez besoin directement du widget.
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_())
Il existe des inconvénients sur cette approche, qui sont énoncés dans le Documents pour l'expéditeur < / a>. Comme vous l'avez écrit, click_handler code> ne peut pas être appelé en toute sécurité par quelque chose d'autre que les boutons spécifiques qui sont connectés à celle-ci.
@ekhumoro: convenu; Ajout du paramètre de données facultatif, de sorte que click_handler () code> peut être utilisé de manière plus générique.