Accès rapide :
La vidéo
Qu'est-ce qu'une action Qt ?
Configuration d'une action Qt
Définir une action « cochable » (checkable)
Connecter un slot sur le lancement de l'action
Injecter des données dans l'action
Le code complet de l'exemple proposé
Cette vidéo vous montre comment définir des actions Qt et comment les intégrer dans une barre de menu ou une barre d'outils.
Assez fréquemment, une interface graphique permet le déclenchement d'un traitement à partir de différents éléments qui la constitue : un item de la barre de menu, un bouton d'une barre d'outils, un raccourci clavier, ou encore à partir d'un menu contextuel. Bien entendu, on s'attend à ce que le même traitement s'exécute indépendamment de l'endroit utilisé pour son déclenchement.
C'est à ce besoin que tente de répondre le concept d'action Qt. Une action Qt agrège les informations relatives au déclenchement d'un traitement. Cette action est ensuite associée à votre barre de menu, une barre d'outils...
Pour instancier une action Qt, il faut utiliser la classe QAction. Le constructeur de cette classe accepte déjà un certain nombre de paramètres, mais il est ensuite possible de continuer la configuration de l'action en fixant certaines propriétés complémentaires. Commençons par un exemple simple : imaginons, que l'on souhaite définir une action de création d'un nouveau document.
1 |
actNew = QAction(QIcon("icons/new.png"), "&New", self) |
En l'état, seules deux propriétés sont définies : l'icône graphique et le texte de l'action. Les quelques lignes qui suivent permet d'obtenir la barre de menu de la fenêtre, d'y ajout un menu « File » et de placer notre action dans ce menu.
1 2 3 |
menuBar = self.menuBar()
file = menuBar.addMenu("&File")
file.addAction(actNew)
|
Voici le visuel que vous devriez observer en lançant la fenêtre graphique contenant la barre de menu.
Une question doit certainement vous tarauder : à quoi correspond le caractère &
placé dans le texte de l'action et dans celui du menu File
?
En fait c'est pour obtenir la lettre soulignée qui permet l'actionnement de la fonctionnalité associée par le clavier. Ainsi, si vous appuyez simultanément
sur les touches « ALT » et « F », vous devriez voir le menu File
s'ouvrir. Et si vous appuyez maintenant sur « N »,
vous lancerez l'action New
.
File
.
Quitte à parler, d'actionnement à partir du clavier, on peut aussi parler du « shortcut » : il s'agit d'une action clavier plus directe pour lancer l'action. Par défaut, le « shortcut » est affiché à la droite de l'élément de menu dans la barre. Voici comment ajouter le « shortcut ».
1 2 |
actNew = QAction(QIcon("icons/new.png"), "&New", self) actNew.setShortcut("Ctrl+N") |
Et voici le nouveau visuel que vous devriez obtenir.
Séquence de touches | Action associée |
---|---|
CTRL + a | Tout sélectionner (Select All) |
CTRL + c | Copier (Copy) |
CTRL + v | Coller (Paste) |
CTRL + o | Ouvrir (Open) |
CTRL + s | Sauver (Save) |
CTRL + x | Couper (Cut) |
CTRL + y | Refaire (Redo) |
CTRL + z | Annuler (Undo) |
Une autre configuration classique consiste à définir la propriété
statusTip
: elle contiendra le texte à afficher dans la barre
de statuts lors du survol de la souris sur l'élément de menu ou de barre d'outils associé à votre action.
1 2 3 |
actNew = QAction(QIcon("icons/new.png"), "&New", self) actNew.setShortcut("Ctrl+N") actNew.setStatusTip("New document") |
Bien entendu, la barre de statuts doit avoir été créée dans l'interface pour pouvoir y visualiser le message de l'action.
Pour injecter une barre de statuts dans la fenêtre, il faut y invoquer la méthode
statusBar
.
1 2 |
statusBar = self.statusBar()
statusBar.showMessage(self.windowTitle()) # Définition du message initial
|
La capture d'écran ci-dessous montre bien l'apparition du message dans la barre de statuts lors du survol de la souris sur l'élément de menu.
Vous pouvez configurer une action comme étant « cochable » : dans ce cas, l'élément visuel associé dans la barre de menu se comportera un peu comme une case à cocher.
1 |
anAction.setCheckable(True)
|
La méthode setCheck
permet de changer l'état « cochable » de l'action.
Nous allons maintenant voir comment connecter un gestionnaire d'événements lors de l'activation de l'action Qt. Pour ce faire, nous allons utiliser le modèle des slots et des signaux Qt, que nous avions déjà un peu présenté précédemment. Pour rappel :
Un signal correspond à un événement que le widget, ou dans notre cas l'action, peut déclencher.
Un slot correspond à un gestionnaire d'événement. Plus précisément, il s'agit d'une méthode : il est conseillé d'adjoindre à une telle méthode le décorateur @Slot.
Une connexion permet d'associer un signal à un slot, en sachant qu'un même slot peut être connecté à plusieurs signaux et que plusieurs slots peuvent être connectés à un même signal.
La classe QAction
expose le signal
triggered
. C'est lui qui est déclenché lors de l'activation
de l'action. Il ne nous reste plus qu'a y connecter un slot.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
def __init__(self): super().__init__() # Début du code du constructeur de la fenêtre actNew = QAction(QIcon("icons/new.png"), "&New", self) actNew.setShortcut("Ctrl+N") actNew.setStatusTip("New document") actNew.triggered.connect(self.newDocument) # Suite du code du constructeur de la fenêtre @Slot() def newDocument(self): print("New document is requested") |
Il est possible de stocker des données dans une action et de les retrouver durant l'exécution d'un slot.
Pour stocker une données dans l'action, vous pouvez utiliser la méthode
setData
.
Pour retrouver la donnée à partir de l'action, vous pouvez utiliser la méthode
data
.
Voici l'ensemble des lignes de codes proposées dans ce document. Elles sont intégrées dans une fenêtre Qt ce qui vous permettra de rapidement tester les aspects étudiés.
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 |
import sys from PySide6.QtCore import Slot from PySide6.QtGui import QIcon, QAction from PySide6.QtWidgets import QApplication, QMainWindow class MyWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Exemple de définition d'actions Qt") self.setWindowIcon(QIcon("icons/file.png")) self.resize(600, 150) actNew = QAction(QIcon("icons/new.png"), "&New", self) actNew.setShortcut("Ctrl+N") actNew.setStatusTip("Open file") actNew.triggered.connect(self.newDocument) menuBar = self.menuBar() file = menuBar.addMenu("&File") file.addAction(actNew) statusBar = self.statusBar() statusBar.showMessage(self.windowTitle()) # Définition du message initial @Slot() def newDocument(self): print("New document is requested") if __name__ == "__main__": app = QApplication(sys.argv) myWindow = MyWindow() myWindow.show() sys.exit(app.exec()) |
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :