1. Introduction aux de menus avec PyQt5
- Les menus constituent une composante essentielle de l'interface graphique utilisateur d'une application, offrant aux utilisateurs un accès facile à différentes fonctionnalités et options.
- PyQt5 propose la classe QMenuBar pour la création de barres de menus dans une application PyQt5. Pour instancier une barre de menu, il est nécessaire d'instancier la classe QMenuBar et de l'ajouter à la fenêtre principale de l'application.
- Cette barre de menu peut contenir plusieurs menus, chacun comportant une liste d'actions. Les actions sont des fonctions déclenchées lorsque l'utilisateur sélectionne un élément du menu.
- Ce tutoriel explore la création et la personnalisation de barres de menus dans PyQt5, couvrant l'ajout de menus, d'actions et de sous-menus, ainsi que la connexion à des fonctions.
- Des sujets tels que l'utilisation de boîtes de dialogues pour l'ouverture et l'enregistrement de fichiers, la personnalisation des menus et des actions, l'utilisation de raccourcis clavier, la création de menus contextuels et l'utilisation de la barre d'outils seront également abordés.
2. Menu simple avec QMenuBar PyQt5
2.1 Création d'un menu avec la classe QMenuBar
La bibliothèque PyQt5 met à disposition une classe appelée QMenuBar pour la création de barres de menus. En instanciant la classe QMenuBar, un objet menuBar est créé, avec des méthodes telles que :
- addMenu(): Ajoute un menu tel que "File", "Edit", "Option"...
- addAction(): Ajoute des commandes aux éléments de menu comme "File->Open", "File->Save", "File->Save As", "File->Exit"...
- addSeparator(): Ajoute un séparateur entre les éléments du menu.
Pour ce faire, créez un fichier Python nommé "simplemenu.py" et insérez-y le code suivant :
Exmple (menu simple avecQMenuBar)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
from PyQt5.QtWidgets import QApplication, QWidget, QMenuBar import sys # Initialisation de l'application Qt app = QApplication(sys.argv) # Création d'une fenêtre principale QWidget root = QWidget() root.setWindowTitle("Simple QMenu PyQt5") root.setGeometry(100, 100, 500, 300) # Création d'une barre de menu en instanciant la classe QMenuBar menuBar = QMenuBar(root) menuBar.setGeometry(0, 0, 500, 25) # Création d'un menu appelé 'File' dans la barre de menu File = menuBar.addMenu('File') # Ajout d'actions au menu 'File' File.addAction('New') # Action : Nouveau File.addAction('Open') # Action : Ouvrir File.addAction('Save') # Action : Enregistrer File.addAction('Save As') # Action : Enregistrer sous File.addAction('Exit') # Action : Quitter # Affichage de la fenêtre principale root.show() # Exécution de l'application sys.exit(app.exec_()) |
2.2 Intégration d'une action dans le menu
Il est également possible d'ajouter une action de commande au menu PyQt, ce qui nous permettra d'attribuer des actions à des clics spécifiques. Par exemple, lorsque nous cliquons sur "Fichier -> Ouvrir", une nouvelle fenêtre peut apparaître, ou lorsque nous cliquons sur "Fichier -> Quitter", nous pouvons fermer la fenêtre. Pour cela, nous devons incorporer des fonctions qui exécutent ces actions :
Exemple (action: File-->Exit)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
from PyQt5.QtWidgets import QApplication, QWidget, QMenuBar import sys def exit(): root.quit() # Initialisation de l'application Qt app = QApplication(sys.argv) # Création d'une fenêtre principale QWidget root = QWidget() root.setWindowTitle("Simple QMenu PyQt5") root.setGeometry(100, 100, 500, 300) # Création d'une barre de menu en instanciant la classe QMenuBar menuBar = QMenuBar(root) menuBar.setGeometry(0, 0, 500, 25) # Création d'un menu appelé 'File' dans la barre de menu File = menuBar.addMenu('File') # Ajout d'actions au menu 'File' File.addAction('New') # Action : Nouveau File.addAction('Open') # Action : Ouvrir File.addAction('Save') # Action : Enregistrer File.addAction('Save As') # Action : Enregistrer sous # Associer le menu 'Exit' à l'action exit() File.addAction('Exit' , exit) # Affichage de la fenêtre principale root.show() # Exécution de l'application sys.exit(app.exec_()) |
3. QMenuBar selon l'approche objet PyQt5
Pour structurer efficacement vos projets Python et prévenir la duplication du code, il est impératif d'adopter une approche orientée objet. À cet égard, il est recommandé de rédiger un code bien organisé en utilisant une classe Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
from PyQt5.QtWidgets import QApplication, QWidget,QMenuBar import sys, os class MyWindow(QWidget): def __init__(self): super().__init__() # ajouter les composants à la fenêtre principale self.initUI() def exit(self): self.close() def initUI(self): self.setWindowTitle("Example QMenu PyQt5") self.setGeometry(100 , 100 , 500 , 300) self.menubar = QMenuBar(self) self.File = self.menubar.addMenu('File') self.File.addAction("Exit", self.exit) if __name__ == '__main__': app = QApplication(sys.argv) mywin = MyWindow() mywin.show() sys.exit(app.exec_()) |
4. Ajouter une action à un élément de menu à l'aide de la classe QAction
Nous allons maintenant voir une autre méthode pour ajouter une action à un élément de menu en utilisant la classe QAction. À cette fin, les étapes suivantes doivent être suivies :
- Nous créons l'action : en utilisant la classe QAction
- Nous ajoutons l'action : au menu en utilisant la méthode addAction()
- Nous connectons l'action : à la méthode qui exécute l'action à l'aide de la méthode trigger.connect()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
from PyQt5.QtWidgets import QApplication, QWidget, QMenuBar, QAction import sys class MenuBarApplication(QWidget): def __init__(self): super(MenuBarApplication, self).__init__() self.setWindowTitle("Objet QMenuBar PyQt5") self.setGeometry(100, 100, 500, 300) # Création d'une barre de menu en instanciant la classe QMenuBar self.menuBar = QMenuBar(self) self.menuBar.setGeometry(0, 0, 500, 25) # Création d'un menu appelé 'File' dans la barre de menu self.file_menu = self.menuBar.addMenu('File') # Ajout d'actions au menu 'File' self.file_menu.addAction('New') # Action : Nouveau self.file_menu.addAction('Open') # Action : Ouvrir self.file_menu.addAction('Save') # Action : Enregistrer self.file_menu.addAction('Save As') # Action : Enregistrer sous # Ajout d'une action "Exit" avec la création d'une fonction associée self.exit_action = QAction('Exit', self) # Connecter l'action à la fonction de sortie de l'application self.exit_action.triggered.connect(self.exit_application) # Ajouter l'action "Exit" au menu "File" self.file_menu.addAction(self.exit_action) def exit_application(self): app.quit() if __name__ == "__main__": app = QApplication(sys.argv) main_app = MenuBarApplication() main_app.show() sys.exit(app.exec_()) |
5. Raccourcis clavier
Pour améliorer l'ergonomie de notre application, nous pouvons mettre en place des raccourcis clavier. Dans cette section, nous aborderons la création d'un raccourci clavier, notamment Ctrl+Q, pour exécuter l'action "Quitter". Pour ce faire, nous devons appliquer la méthode setShortcut() à l'objet exitAction :
1 2 |
# ajouter le raccourcie clavier à l'action du menu exitAction.setShortcut('Ctrl+Q') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
from PyQt5.QtWidgets import QApplication, QWidget,QMenuBar, QAction import sys class MyWindow(QWidget): def __init__(self): super().__init__() self.initUI() def exit(self): self.quit() def initUI(self): self.setWindowTitle("Example QMenu PyQt5") self.setGeometry(100 , 100 , 500 , 300) self.menubar = QMenuBar(self) self.File = self.menubar.addMenu('File') # create an action with QAction class exitAction = QAction('&Exit' , self) # adding action to the menu File self.File.addAction(exitAction) # adding a shortcut to the action exitAction.setShortcut('Ctrl+Q') # connecting to the method that perform the action exitAction.triggered.connect(self.exit) if __name__ == '__main__': app = QApplication(sys.argv) mywin = MyWindow() mywin.show() sys.exit(app.exec_()) |
En exécutant le code ci-dessus vous obtenez la fenêtre suivante avec un menu File ayant une action Exit doté d'un raccourcis clavier: "Ctrl+Q" en l'appliquant vous quittez la fenêtre:
6. Liste des méthodes associées à la classe QMenuBar
La classe QMenuBar de PyQt5 offre plusieurs méthodes pour gérer et personnaliser les barres de menus. Ces méthodes vous permettent de manipuler la structure et le comportement de la barre de menus dans votre application PyQt5. Vous pouvez les utiliser pour ajouter des menus, des séparateurs, personnaliser l'apparence et bien plus encore. Pour plus de détails, vous pouvez vous référer à la documentation officielle de PyQt5: https://www.riverbankcomputing.com/static/Docs/PyQt5/
Voici quelques-unes des méthodes associées à la classe QMenuBar :
- addMenu(title: str) -> QMenu : Ajoute un nouveau menu à la barre de menus avec le titre spécifié et renvoie l'objet QMenu correspondant.
- addSeparator() : Ajoute un séparateur à la barre de menus. Les séparateurs sont utilisés pour diviser visuellement les groupes d'éléments de menu.
- clear() : Efface tous les menus de la barre de menus.
- insertMenu(before: QMenu, menu: QMenu) : Insère un nouveau menu avant un menu existant spécifié dans la barre de menus.
- setCornerWidget(widget: QWidget) : Définit un widget dans le coin de la barre de menus. Cela peut être utilisé pour ajouter des widgets personnalisés tels que des boutons.
- setNativeMenuBar(useNativeMenuBar: bool) : Active ou désactive l'utilisation de la barre de menus native du système d'exploitation. Cette méthode est utile sur macOS pour activer ou désactiver la barre de menus native.
- setVisible(visible: bool) : Définit la visibilité de la barre de menus. Si visible est True, la barre de menus est affichée ; sinon, elle est masquée.
- cornerWidget() -> QWidget : Renvoie le widget défini dans le coin de la barre de menus à l'aide de setCornerWidget().
7. Quiz
Quel est le rôle de la classe QMenuBar dans PyQt5 ?
a) Gérer les barres d'outils dans une interface PyQt5.
b) Gérer les menus dans une interface PyQt5.
c) Gérer les fenêtres dans une interface PyQt5.
Quelle méthode est utilisée pour ajouter un menu à une instance de QMenuBar ?
a) addMenu()
b) insertMenu()
c) setMenu()
Comment peut-on ajouter un élément de menu à un menu existant dans QMenuBar ?
a) addMenuItem()
b) addItem()
c) addAction()
Quelle méthode est utilisée pour créer un menu contextuel dans PyQt5 ?
a) createContextMenu()
b) createMenu()
c) setContextMenu()
Comment peut-on connecter un signal à une action de menu dans PyQt5 ?
a) connectAction()
b) triggered.connect()
c) linkAction()
Quel attribut peut être utilisé pour définir un raccourci clavier pour une action de menu ?
a) shortcut
b) key
c) accelerator
Quelle méthode est utilisée pour désactiver une action de menu dans QMenuBar ?
a) disableAction()
b) setEnabled()
c) deactivateAction()
Comment peut-on créer une barre de menu pour une fenêtre principale dans PyQt5 ?
a) En utilisant QMenu
b) En utilisant QMenuBar
c) En utilisant QToolbar
Quel est l'avantage d'utiliser QMenuBar par rapport à QMenu seul pour la création de barres de menu ?
a) QMenuBar permet d'ajouter des icônes aux menus.
b) QMenuBar permet de gérer plusieurs menus de manière hiérarchique.
c) QMenuBar est plus léger en termes de ressources.
Comment peut-on obtenir la liste des actions d'un menu dans QMenuBar ?
a) menuActions()
b) actions()
c) getActions()
- Rép Exercice 1: b) Gérer les menus dans une interface PyQt5.
- Rép Exercice 2: a) addMenu()
- Rép Exercice 3: c) addAction()
- Rép Exercice 4: b) createMenu()
- Rép Exercice 5: b) triggered.connect()
- Rép Exercice 6: a) shortcut
- Rép Exercice 7: b) setEnabled(False)
- Rép Exercice 8: b) En utilisant QMenuBar
- Rép Exercice 9: b) QMenuBar permet de gérer plusieurs menus de manière hiérarchique.
- Rép Exercice10: b) actions()
Younes Derfoufi
CRMEF OUJDA