Les bases de la programmation des interfaces graphiques avec Qt et PyQt

Nous allons étudier la programmation des interfaces graphiques (en anglais, on parle de GUI : Graphical User Interface) grâce à PyQt4 qui permet d’utiliser la bibliothèque Qt.

Création d’une première fenêtre

Pour créer une première fenêtre, on va utiliser la classe QWidget.

Voici un programme très simple de création d’une fenêtre graphique.

Exemple

# importations a faire pour la realisation d'une interface graphique
import sys
from PyQt4.QtGui import QApplication, QWidget

# Premiere etape : creation d'une application Qt avec QApplication
#    afin d'avoir un fonctionnement correct avec IDLE ou Canopy
#    on verifie s'il existe deja une instance de QApplication
app = QApplication.instance() 
if not app: # sinon on cree une instance de QApplication
    app = QApplication(sys.argv)

# creation d'une fenetre avec QWidget dont on place la reference dans fen
fen = QWidget()

# la fenetre est rendue visible
fen.show()

# execution de l'application, l'execution permet de gerer les evenements
app.exec_()

Exemple : On fixe la position et la taille de la fenêtre

import sys
from PyQt4.QtGui import QApplication, QWidget

app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)

fen = QWidget()

# on donne un titre a la fenetre
fen.setWindowTitle("Premiere fenetre")

# on fixe la taille de la fenetre
fen.resize(500,250)

# on fixe la position de la fenetre
fen.move(300,50)

fen.show()
app.exec_()

Exemple : Création de deux fenêtres

import sys
from PyQt4.QtGui import QApplication, QWidget

app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)

fen1 = QWidget()
fen1.setWindowTitle("Fenetre 1")
fen1.resize(500,250)
fen1.move(300,50)
fen1.show()

fen2 = QWidget()
fen2.setWindowTitle("Fenetre 2")
fen2.resize(400,300)
fen2.move(200,150)
fen2.show()

app.exec_()

Création d’une fenêtre personnalisée

Si nous voulons à présent que notre fenêtre dispose d’autres fonctionnalités que celles qui existent dans la classe QWidget, il nous faut créer une classe dérivée pour laquelle nous pourrons ajouter des attributs et des méthodes supplémentaires.

Exemple

import sys
from PyQt4.QtGui import QApplication, QWidget

class Fenetre(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowTitle("Ma fenetre")
        self.show()

app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)
fen = Fenetre()
app.exec_()

Gestion des événements de la souris dans la fenêtre

Pour interagir avec l’utilisateur, nous allons devoir effectuer de la programmation événementielle. Il va ainsi s’agir de gérer les événements qui seront déclenchés par l’utilisateur (appui sur la souris, etc.).

Nous allons voir comment traiter l’événement que constitue un appui sur un bouton de la souris dans la fenêtre.

Gestion de l’appui sur un bouton de la souris dans la fenêtre

Exemple

import sys
from PyQt4.QtGui import QApplication, QWidget

class Fenetre(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowTitle("Ma fenetre")
        self.show()

    def mousePressEvent(self,event):
        print("appui souris")

app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)
fen = Fenetre()
app.exec_()

La méthode mousePressEvent() est un gestionnaire d’événement (en anglais, event handler) qui est automatiquement appelé lors de l’appui sur un bouton de la souris. Il nous a donc suffit de redéfinir cette méthode de la classe QWidget et d’y indiquer les instructions à exécuter pour gérer cet événement. Il faut noter que dans sa définition cette méthode doit pouvoir recevoir un argument (nous verrons plus loin l’utilisation de cet argument).

Liste des gestionnaires d’événements issus de la souris

mousePressEvent() appui sur un bouton de la souris
mouseReleaseEvent() relâchement d’un bouton de la souris
mouseDoubleClickEvent() double clic sur un bouton de la souris
mouseMoveEvent() mouvement de la souris (par défaut, quand un bouton est appuyé)

Utilisation de l’information associée à un événement

Les arguments transmis aux méthodes qui gèrent les événements de la souris sont des objets de type QMouseEvent. Un objet de cette classe est automatiquement créé par Python lors du déclenchement de l’événement. Cet objet contient de plus d’autres informations. En particulier pour un appui sur le bouton de la souris, il contient une information concernant le bouton qui a été appuyé. Cette information peut être récupérée grâce à la méthode button(). Les valeurs prises peuvent être comparées avec les constantes prédéfinies ci-dessous :

Qt.LeftButton bouton gauche
Qt.RightButton bouton droit
Qt.MidButton bouton du milieu
import sys
from PyQt4.QtGui import QApplication, QWidget
from PyQt4.QtCore import Qt

class Fenetre(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowTitle("Ma fenetre")
        self.show()

    def mousePressEvent(self,event):
        if event.button() == Qt.LeftButton:
            print("appui bouton gauche")

app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)
fen = Fenetre()
app.exec_()

De même, les coordonnées de la position du curseur de souris au moment de l’appui peuvent être obtenues au moyen des méthodes x() et y().

Exemple

import sys
from PyQt4.QtGui import QApplication, QWidget
from PyQt4.QtCore import Qt

class Fenetre(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowTitle("Ma fenetre")
        self.show()

    def mousePressEvent(self,event):
        if event.button() == Qt.LeftButton:
            print("appui bouton gauche")
            print("position = " + str(event.x()) + " " + str(event.y()))
            
app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)
fen = Fenetre()
app.exec_()

Dans le cas du gestionnaire mouseMoveEvent(), il est possible d’activer le suivi des mouvements de la souris par la fenêtre même si aucun bouton n’est appuyé. Pour cela, il faut utiliser la méthode setMouseTracking(True)() disponible pour la classe QWidget.

Exemple

import sys
from PyQt4.QtGui import QApplication, QWidget

class Fenetre(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowTitle("Ma fenetre")

        # activation du suivi du mouvement de la souris
        self.setMouseTracking(True)
        
        self.show()

    def mouseMoveEvent(self,event):
        print("position = " + str(event.x()) + " " + str(event.y()))
            
app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)
fen = Fenetre()
app.exec_()