Gestion des évènements en PyQt
La gestion d’évènements en PyQt
1. Propos introductif
Le présent chapitre se penche spécifiquement sur la gestion des évènements en PyQt. Il s’agit ici d’apprendre à associer en PyQt une action quelconque (l’appui sur un bouton de l’interface par exemple) avec un traitement particulier (par exemple l’affichage d’un texte, le lancement d’un calcul...).
Deux notions sont particulièrement importantes en PyQt pour gérer les évènements :
-
La notion de « signal »
-
La notion d’« emplacement » ou slot (l’emploi de la terminologie slot sera privilégié par la suite)
N’importe quel composant ou widget PyQt est habilité à émettre un signal ou un évènement. En effet, signal et évènement désigneront ici la même notion. Cette émission s’arrête là, hormis que la gestion de ce signal peut être dévolue à un slot qui n’est ni plus ni moins que la fonction ou la méthode de classe qui va effectuer un traitement lorsque ce signal en particulier est émis.
2. Premier exemple : signaux et slots
Prenons un premier exemple très général d’utilisation des signaux et des slots en PyQt. Soit la fenêtre suivante, héritée de QWidget, qui inclut pour le moment un simple bouton à...
Plus loin dans la gestion d’évènements
1. La transmission de données
L’exemple précédent, développé dans l’introduction, explique le lien basique entre signal et slot. Souvent l’évènement considéré autorise à accéder à une valeur courante (associée au widget) et à le transmettre au slot. C’est par exemple le cas lorsque l’on observe que le signal d’un QLineEdit correspond à l’évènement déclenché lors de chaque changement du contenu textuel : il est alors intéressant de « transmettre » au slot le contenu courant du widget considéré.
Le petit programme suivant, très semblable au précédent, copie en temps réel le contenu d’un QLineEdit vers un autre QLineEdit.
On connecte ainsi le signal au slot avec le code suivant :
self.edition.textChanged.connect(self.exempleSlot)
Puis on accède à la valeur à recopier dans le slot lui-même avant de la recopier effectivement dans le second widget.
def exempleSlot(self):
texteCourant = self.edition.text()
self.editionCopie.setText(texteCourant)
Le code global est le suivant :
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class FenetreSimple(QWidget):
def __init__(self):
super().__init__()
self.execute()
def exempleSlot(self):
texteCourant = self.edition.text()
self.editionCopie.setText(texteCourant)
def execute(self):
self.disposition = QVBoxLayout()
self.resize(250, 300)
self.move(50, 500)
self.setWindowTitle("Signaux et slots")
self.edition = QlineEdit() ...