PyQt - Signaux et slots

Contrairement à une application en mode console, qui est exécutée de manière séquentielle, une application basée sur l'interface graphique est pilotée par les événements. Les fonctions ou méthodes sont exécutées en réponse aux actions de l'utilisateur comme cliquer sur un bouton, sélectionner un élément dans une collection ou un clic de souris, etc., appeléevents.

Les widgets utilisés pour créer l'interface GUI agissent comme la source de ces événements. Chaque widget PyQt, qui est dérivé de la classe QObject, est conçu pour émettre 'signal'en réponse à un ou plusieurs événements. Le signal seul n'effectue aucune action. Au lieu de cela, il est 'connecté' à un 'slot». L'emplacement peut être n'importe quelcallable Python function.

Dans PyQt, la connexion entre un signal et un slot peut être réalisée de différentes manières. Voici les techniques les plus couramment utilisées -

QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)

Un moyen plus pratique d'appeler une fonction slot_function, lorsqu'un signal est émis par un widget est le suivant -

widget.signal.connect(slot_function)

Supposons si une fonction doit être appelée lorsqu'un bouton est cliqué. Ici, le signal cliqué doit être connecté à une fonction appelable. Il peut être réalisé dans l'une des deux techniques suivantes -

QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)

ou

button.clicked.connect(slot_function)

Exemple

Dans l'exemple suivant, deux objets QPushButton (b1 et b2) sont ajoutés dans la fenêtre QDialog. Nous voulons appeler les fonctions b1_clicked () et b2_clicked () en cliquant respectivement sur b1 et b2.

Lorsque b1 est cliqué, le signal clicked () est connecté à la fonction b1_clicked ()

b1.clicked.connect(b1_clicked())

Lorsque b2 est cliqué, le signal clicked () est connecté à la fonction b2_clicked ()

QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)

Exemple

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def window():
   app = QApplication(sys.argv)
   win = QDialog()
   b1 = QPushButton(win)
   b1.setText("Button1")
   b1.move(50,20)
   b1.clicked.connect(b1_clicked)

   b2 = QPushButton(win)
   b2.setText("Button2")
   b2.move(50,50)
   QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)

   win.setGeometry(100,100,200,100)
   win.setWindowTitle("PyQt")
   win.show()
   sys.exit(app.exec_())

def b1_clicked():
   print "Button 1 clicked"

def b2_clicked():
   print "Button 2 clicked"

if __name__ == '__main__':
   window()

Le code ci-dessus produit la sortie suivante -

Production

Button 1 clicked
Button 2 clicked