PyQt en Python

PyQt est une puissante bibliothèque Python pour créer des interfaces graphiques utilisateur (GUI), qui peut être utilisée pour remplacer Tkinter intégré à Python.

PyQt est la liaison Python du framework Qt, largement utilisé dans le développement d'applications de bureau.

Qt est un framework de développement d'applications C++ multiplateforme.

PyQt permet aux développeurs Python d'exploiter la bibliothèque Qt pour créer de puissantes applications GUI.

PyQt possède les versions majeures suivantes :

  • PyQt4 : liaisons basées sur Qt4
  • PyQt5 : liaisons basées sur Qt5
  • PyQt6 : liaisons basées sur Qt6 (dernière version)

Installation de PyQt

Installer PyQt5 avec pip :

# 安装PyQt5
pip install PyQt5

# 安装Qt设计师和其他工具(可选)
pip install PyQt5-tools

Premier programme PyQt

Créer une fenêtre simple

Ce qui suit est un programme PyQt de base qui crée une fenêtre vide :

Exemple

from PyQt5.QtWidgets import QApplication, QWidget

# Créer une instance d'application
app = QApplication([])

# Créer la fenêtre principale
window = QWidget()
window.setWindowTitle("Mon premier programme PyQt")
window.setGeometry(100, 100, 400, 300)  # (x, y, largeur, hauteur)

# Afficher la fenêtre
window.show()

# Exécuter l'application
app.exec_()

Explication de code

  1. QApplicationGère le flux de contrôle et les paramètres principaux des applications GUI.
  2. QWidgetLa classe de fenêtre la plus élémentaire ; tous les composants d'interface utilisateur en héritent.
  3. setWindowTitle()Définit le titre de la fenêtre.
  4. setGeometry()Définit la position et la taille de la fenêtre.
  5. show()Affiche la fenêtre.
  6. app.exec_()Démarre la boucle d'événements et attend l'interaction de l'utilisateur.

Une application PyQt typique se compose des parties suivantes :

  1. Objet QApplicationChaque application PyQt a besoin d'une instance QApplication.
  2. Fenêtres et widgetsComposants d'interface utilisateur.
  3. Boucle d'événementsUne boucle qui gère les entrées utilisateur et les événements système.
  4. Gestionnaires d'événementsFonctions ou méthodes qui répondent aux événements.

Exemple

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
       
        # Définir le titre et la taille de la fenêtre
        self.setWindowTitle("Ma première application PyQt")
        self.setGeometry(100, 100, 400, 300)  # x, y, largeur, hauteur
       
        # Créer un bouton
        self.button = QPushButton("Cliquez-moi", self)
        self.button.setGeometry(150, 150, 100, 30)
        self.button.clicked.connect(self.button_clicked)
       
    def button_clicked(self):
        print("Le bouton a été cliqué !")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())


Widgets PyQt courants

Bouton (QPushButton)

Exemple

from PyQt5.QtWidgets import QPushButton

button = QPushButton("Cliquez-moi", window)
button.move(150, 150)  # Définir la position du bouton

Étiquette (QLabel)

Exemple

from PyQt5.QtWidgets import QLabel

label = QLabel("Bonjour PyQt !", window)
label.move(100, 100)

Zone de texte (QLineEdit)

Exemple

from PyQt5.QtWidgets import QLineEdit

textbox = QLineEdit(window)
textbox.move(100, 50)

Pour plus de widgets courants, voir :https://www.example.com/python3/python-pyqt-widgets.html


Gestion de la mise en page (QVBoxLayout)

L'utilisation de gestionnaires de disposition peut ajuster automatiquement la position des widgets :

Exemple

from PyQt5.QtWidgets import QVBoxLayout, QLabel, QPushButton

layout = QVBoxLayout()
layout.addWidget(QLabel("Nom d'utilisateur"))
layout.addWidget(QLineEdit())
layout.addWidget(QPushButton("Connexion"))
window.setLayout(layout)

Pour plus de contenu sur la gestion de la mise en page, voir :https://www.example.com/python3/python-pyqt-layout.html


Mécanisme de signaux et de slots

PyQt utilise le mécanismeSignaletSlotpour gérer les événements.

Le mécanisme de signaux et de slots de PyQt est le mécanisme central pour la communication entre objets.

  • Signal : Une notification émise lorsqu'un événement spécifique se produit.
  • Slot : Une fonction ou méthode qui répond aux signaux.

Exemple

from PyQt5.QtWidgets import QPushButton

def on_button_click():
    print("Le bouton a été cliqué !")

button = QPushButton("Cliquez-moi", window)
button.clicked.connect(on_button_click)  # Connecter le signal et le slot

Signaux personnalisés

Exemple

from PyQt5.QtCore import pyqtSignal, QObject

class MyEmitter(QObject):
    my_signal = pyqtSignal(str)  # Définir un signal

emitter = MyEmitter()
emitter.my_signal.connect(lambda x: print(f"Signal reçu : {x}"))
emitter.my_signal.emit("Bonjour")  # Émettre le signal

Pour plus de contenu sur la gestion des dispositions, voir :https://www.example.com/python3/python-pyqt-signals-and-slots.html


Utilisation de Qt Designer

Qt Designer est un outil de conception visuelle qui vous permet de glisser-déposer des widgets pour concevoir des interfaces :

  • Lancez Designer (généralement situé dans le répertoire Lib\site-packages\qt5_applications\Qt\bin de votre installation Python)
  • Concevez l'interface et enregistrez-la en tant que fichier.uifile
  • convertira le fichier.uien code Python :

    pyuic5 input.ui -o output.py

Utilisez l'interface générée dans le code :

Exemple

from PyQt5 import uic

# Charger le fichier UI
Form, Window = uic.loadUiType("output.ui")

# Utiliser l'interface utilisateur
app = QApplication(sys.argv)
window = Window()
form = Form()
form.setupUi(window)
window.show()
sys.exit(app.exec_())

Exercice pratique : application simple de bloc-notes

Conception d'interface

Exemple

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit,
                            QAction, QFileDialog, QMessageBox)

class Notepad(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
       
    def initUI(self):
        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)
       
        self.create_actions()
        self.create_menus()
       
        self.setWindowTitle('Bloc-notes simple')
        self.setGeometry(100, 100, 800, 600)
       
    def create_actions(self):
        # Actions du menu Fichier
        self.new_action = QAction('Nouveau', self)
        self.new_action.setShortcut('Ctrl+N')
        self.new_action.triggered.connect(self.new_file)
       
        self.open_action = QAction('Ouvrir', self)
        self.open_action.setShortcut('Ctrl+O')
        self.open_action.triggered.connect(self.open_file)
       
        self.save_action = QAction('Enregistrer', self)
        self.save_action.setShortcut('Ctrl+S')
        self.save_action.triggered.connect(self.save_file)
       
        self.exit_action = QAction('Quitter', self)
        self.exit_action.setShortcut('Ctrl+Q')
        self.exit_action.triggered.connect(self.close)
       
        # Actions du menu Édition
        self.copy_action = QAction('Copier', self)
        self.copy_action.setShortcut('Ctrl+C')
        self.copy_action.triggered.connect(self.text_edit.copy)
       
        self.paste_action = QAction('Coller', self)
        self.paste_action.setShortcut('Ctrl+V')
        self.paste_action.triggered.connect(self.text_edit.paste)
       
        self.cut_action = QAction('Couper', self)
        self.cut_action.setShortcut('Ctrl+X')
        self.cut_action.triggered.connect(self.text_edit.cut)
       
    def create_menus(self):
        menubar = self.menuBar()
       
        # Menu Fichier
        file_menu = menubar.addMenu('Fichier')
        file_menu.addAction(self.new_action)
        file_menu.addAction(self.open_action)
        file_menu.addAction(self.save_action)
        file_menu.addSeparator()
        file_menu.addAction(self.exit_action)
       
        # Menu Édition
        edit_menu = menubar.addMenu('Édition')
        edit_menu.addAction(self.copy_action)
        edit_menu.addAction(self.paste_action)
        edit_menu.addAction(self.cut_action)
       
    def new_file(self):
        self.text_edit.clear()
       
    def open_file(self):
        filename, _ = QFileDialog.getOpenFileName(self, 'Ouvrir un fichier')
        if filename:
            try:
                with open(filename, 'r') as f:
                    self.text_edit.setText(f.read())
            except Exception as e:
                QMessageBox.warning(self, 'Erreur', f'Impossible d’ouvrir le fichier : {e}')
               
    def save_file(self):
        filename, _ = QFileDialog.getSaveFileName(self, 'Enregistrer le fichier')
        if filename:
            try:
                with open(filename, 'w') as f:
                    f.write(self.text_edit.toPlainText())
            except Exception as e:
                QMessageBox.warning(self, 'Erreur', f'Impossible d’enregistrer le fichier : {e}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    notepad = Notepad()
    notepad.show()
    sys.exit(app.exec_())


Widgets principaux de PyQt5

La plupart des widgets se trouvent dans PyQt5.QtWidgets.

Les fonctionnalités avancées (telles que le multimédia, la mise en réseau) peuvent nécessiter d'autres modules (par exemple, QtCore, QtGui, QtNetwork, etc.).

QListView/QTableView/QTreeView doivent être utilisés avec un modèle de données (tel que QStandardItemModel) pour une plus grande flexibilité.

Autres extensions d'installation :

pip install PyQtWebEngine  # 网页支持
pip install PyQtChart      # 图表支持
Catégorie de widgetNom du widgetModuleDescription
Widgets de fenêtre de baseQWidgetQtWidgetsClasse de base pour tous les objets d'interface utilisateur, peut être utilisée comme une fenêtre vide ou un conteneur.
QMainWindowQtWidgetsCadre de fenêtre principale, contenant une barre de menu, une barre d'outils, une barre d'état, etc.
QDialogQtWidgetsClasse de base pour les boîtes de dialogue, utilisée pour les fenêtres pop-up.
Gestion de la dispositionQVBoxLayoutQtWidgetsGestionnaire de disposition verticale
QHBoxLayoutQtWidgetsGestionnaire de disposition horizontal
QGridLayoutQtWidgetsGestionnaire de disposition en grille
QFormLayoutQtWidgetsGestionnaire de disposition de formulaire (paires libellé + champ de saisie)
Classes de boutonsQPushButtonQtWidgetsBouton normal
QRadioButtonQtWidgetsBouton radio
QCheckBoxQtWidgetsCase à cocher
QToolButtonQtWidgetsBouton de barre d'outils (peut avoir une icône)
Widgets de saisieQLineEditQtWidgetsZone de saisie de texte sur une ligne
QTextEditQtWidgetsÉditeur de texte enrichi multiligne (prend en charge le HTML)
QPlainTextEditQtWidgetsÉditeur de texte brut multiligne
QSpinBoxQtWidgetsZone de sélection numérique (entier)
QDoubleSpinBoxQtWidgetsZone de sélection numérique (flottant)
QComboBoxQtWidgetsListe déroulante
QDateEditQtWidgetsSélecteur de date
QTimeEditQtWidgetsSélecteur d'heure
QDateTimeEditQtWidgetsSélecteur de date et d'heure
QSliderQtWidgetsCurseur (horizontal/vertical)
QDialQtWidgetsBouton rotatif
Widgets d'affichageQLabelQtWidgetsÉtiquette texte/image
QLCDNumberQtWidgetsAfficheur numérique LCD
QProgressBarQtWidgetsBarre de progression
QStatusBarQtWidgetsBarre d'état (généralement utilisée pourQMainWindow)
Classes de conteneurQGroupBoxQtWidgetsCadre de groupe (conteneur avec titre)
QTabWidgetQtWidgetsConteneur d'onglets
QStackedWidgetQtWidgetsConteneur empilé (affiche un widget enfant à la fois)
QScrollAreaQtWidgetsConteneur de zone de défilement
QMdiAreaQtWidgetsZone MDI (Multiple Document Interface)
Liste/Table/ArborescenceQListWidgetQtWidgetsContrôle de liste (avec gestion des éléments)
QTreeWidgetQtWidgetsWidget d'arborescence
QTableWidgetQtWidgetsWidget de tableau
QListViewQtWidgetsVue de liste (nécessite un modèle de données)
QTableViewQtWidgetsVue de tableau (nécessite un modèle de données)
QTreeViewQtWidgetsVue d'arborescence (nécessite un modèle de données)
Menu/Barre d'outilsQMenuBarQtWidgetsBarre de menus
QMenuQtWidgetsMenu (peut contenir des sous-menus et des actions)
QToolBarQtWidgetsBarre d'outils
QActionQtWidgetsAction (utilisée pour les éléments de menu, les boutons de barre d'outils, etc.)
Boîte de dialogueQFileDialogQtWidgetsBoîte de dialogue de sélection de fichier
QColorDialogQtWidgetsBoîte de dialogue de sélection de couleur
QFontDialogQtWidgetsBoîte de dialogue de sélection de police
QInputDialogQtWidgetsBoîte de dialogue de saisie (texte, nombres, etc.)
QMessageBoxQtWidgetsBoîte de message (avertissement, erreur, question, etc.)
Vue graphiqueQGraphicsViewQtWidgetsGraphics View Framework (pour les graphiques 2D)
QGraphicsSceneQtWidgetsScène graphique (pour une utilisationQGraphicsViewcombinée)
Autres composants fonctionnelsQCalendarWidgetQtWidgetsWidget de calendrier
QSplashScreenQtWidgetsÉcran de démarrage
QSystemTrayIconQtWidgetsIcône de la zone de notification
QWebEngineViewQtWebEngineWidgetsComposant de navigateur Web (nécessite une installation séparéePyQtWebEngine)

Ressources d'apprentissage

Autres extensions