Participer au site avec un Tip
Rechercher
 

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 :

Définition d'actions Qt

Thèmes graphiques Mise en oeuvre d'une barre de menu


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é

La vidéo

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.


Définition d'actions Qt.

Qu'est-ce qu'une action Qt ?

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...

Configuration d'une action Qt

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)
Définition d'une action Qt
le dernier paramètre doit correspondre à la fenêtre (QMainWindow ou classe dérivée) dans laquelle l'action doit être considérée.

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)
Ajout de l'action dans la barre de menu

Voici le visuel que vous devriez observer en lançant la fenêtre graphique contenant la barre de menu.

Ajout de l'action dans la barre de menu
je vous laisse, bien entendu, libre de choisir les icônes que vous souhaitez pour vos actions. Néanmoins, si vous n'avez pas encore d'icônes et que vous souhaitez rapidement faire quelques premiers tests, vous pouvez télécharger le jeu d'icônes que j'utilise pour mes exemples.

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.

selon le thème graphique utilisé (et notamment le thème WindowsVista), le souligné n'apparaît pas initialement. Il faut d'abord appuyer sur la touche « ALT » du clavier pour qu'il apparaisse sur le menu 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")
Ajout d'une shortcut à l'action

Et voici le nouveau visuel que vous devriez obtenir.

Ajout d'une shortcut à l'action
il y a des séquences de touches standards à utiliser à bon escient. Ainsi la « CRTL + X » est traditionnellement associé à l'action « Cut » : essayez de ne l'utilisez pas pour faire autre chose. Voici un rappel sur quelques séquences de touches ainsi que les actions qui leurs sont classiquement associées.
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")
Ajout d'une shortcut à l'action

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
Ajout de la barre de statuts à votre fenêtre

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.

Ajout d'une shortcut à l'action

Définir une action « cochable » (checkable)

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)
Définir une action « cochable » (checkable).

La méthode setCheck permet de changer l'état « cochable » de l'action.

Connecter un slot sur le lancement 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 :

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")
Connexion d'un slot sur le signal triggered

Injecter des données dans l'action

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.

Le code complet de l'exemple proposé

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())
Définition d'une action Qt


Thèmes graphiques Mise en oeuvre d'une barre de menu