Introduction à QMainWindow dans Qt

Introduction :

  • Qt est un framework de développement C++ avec des capacités multiplateformes.
  • Cet article présente QMainWindow, qui permet d'ajouter des outils détaillés à l'interface utilisateur.
  1. QMainWindow

La structure de fenêtre standard la plus complexe par défaut

  • Fournit une barre de menus, barres d'outils, barre d'état et fenêtres d'ancrage
  • Barre de menus: Une seule possible, créée en haut de la fenêtre
  • Barres d'outils: Plusieurs possibles, une fournie par défaut, peuvent être ancrées sur les côtés haut, bas, gauche et droit de la fenêtre
  • Barre d'état: Une seule possible, en bas de la fenêtre
  • Fenêtres d'ancrage: Plusieurs possibles, aucune fournie par défaut, peuvent être ancrées sur les côtés haut, bas, gauche et droit de la fenêtre

1.1 Barre de menus

Création de la barre de menus

  • Obtenir la barre de menus fournie par QMainWindow
QMenuBar* barreMenus = menuBar();   //MenuBar est dans QML

  • Créer une nouvelle et l'assigner à la fenêtre
QMenuBar* barreMenus = new QMenuBar;
this->setMenuBar(barreMenus);

Ajout de menus

QMenu* menuFichier = new QMenu("Fichier");  // ou utiliser directement la fonction de la barre de menus
menuFichier->addAction("Nouveau");
menuFichier->addAction("Ouvrir");
// Ajout d'un menu existant, retourne l'action associée
QAction* action = barreMenus->addMenu(menuFichier);
// Ajout d'un menu par titre
QMenu* menuEdition = barreMenus->addMenu("Édition");
// Ajout d'un menu avec icône et titre
QMenu* menuConstruction = barreMenus->addMenu(QIcon(":/images/mm.png"),"Construction");

Ajout d'actions

menuEdition->addAction("Annuler");
menuEdition->addAction(style()->standardIcon
                    (QStyle::StandardPixmap::SP_FileIcon),"Rétablir");
menuEdition->addAction("Supprimer",this,[](){qDebug()<<"Suppression";});
menuEdition->addAction("Couper",[](){qDebug()<<"Couper";},QKeySequence("ctrl+x"));

Ajout d'icônes/définir comme sélectionné

Dans la barre de menus, ajouter une icône à un menu remplacera le texte, mais dans les éléments de menu, l'icône peut être affichée avec le texte

QMenuBar* barreMenus = menuBar();
QMenu* menuTexte = barreMenus->addMenu(QIcon(":/Resource/femme.png"), "Texte");

// Création d'un sous-menu
QMenu* menuChoix = new QMenu("Choix");
menuChoix->addAction("Poulet rôti");
menuChoix->addAction(QIcon(":/Resource/femme.png"), "Canard rôti");
menuChoix->addAction("Agneau rôti");

// Définir comme sélectionné, sélectionné par défaut
QAction* selection = menuChoix->addAction("Sélection");
selection->setCheckable(true);
// Ajouter le menu à l'élément de menu
menuTexte->addMenu(menuChoix);

Ajout de raccourcis clavier aux menus

Les raccuorcis clavier utilisent le symbole & suivi d'une majuscule, puis en utilisant la combinaison Alt + cette lettre

barreMenus->addMenu("Édition(&B)");
barreMenus->addMenu("&Fichier");

En cliquant sur un élément de menu, l'objet émet un signal

// Signal émis par l'objet QAction lors du clic
[signal] void QAction::triggered(bool checked = false);

1.2 Barres d'outils

Création d'une barre d'outils

QToolBar *barreOutils = addToolBar("barreOutils");

Ajout d'actions

// Sans icône, affiche le texte
barreOutils->addAction("Outil");
// Avec icône, affiche l'icône, le texte comme info-bulle
barreOutils->addAction(style()->standardIcon
                    (QStyle::StandardPixmap::SP_ArrowBack),"1213123");

Ajout de widgets

// Tout QWidget ou ses sous-classes peuvent être ajoutés
barreOutils->addWidget(new QPushButton("Appuyez-moi"));

1.3 Barre d'état

Généralement, la barre d'état contient des widgets pour afficher certaines propriétés, le plus courant étant l'ajout d'étiquettes QLabel.

Création de la barre d'état

  • Obtenir la barre d'état fournie
QStatusBar* barreEtat = statusBar();

  • Ou en créer une nouvelle
QStatusBar* barreEtat = new QStatusBar;
this->setStatusBar(barreEtat);

Ajout de widgets

// À gauche
barreEtat->addWidget(new QLabel("bonjour"));
barreEtat->addWidget(new QPushButton("état"));
// À droite (Permanent)
barreEtat->addPermanentWidget(new QLabel("permanent"));
barreEtat->addPermanentWidget(new QLabel("perma"));

Opérations courantes (changement d'état)

QStatusBar* etat = statusBar();
// À gauche
etat->addWidget(new QPushButton("Prêt"));
etat->addWidget(new QPushButton(QWidget::style()->standardPixmap(QStyle::StandardPixmap::SP_ArrowDown), "Bas"));
// À droite
QPushButton* btn = new QPushButton("Changer");
etat->addPermanentWidget(btn);

// Fonction: cliquer pour changer l'état gauche
QObject::connect(btn, &QPushButton::clicked, [=]() {
        etat->showMessage("Chargement en cours.....");
          // Utiliser un minuteur pour changer l'état, une seconde pour prêt, une seconde pour effacer
          QTimer::singleShot(1000, [=]() {
              etat->showMessage("Prêt");
              QTimer::singleShot(1000, [=]() {
                  etat->clearMessage();
                  });
              });
          });

// Signal de la barre d'état
QObject::connect(etat, &QStatusBar::messageChanged, [=](auto mess) {
          qInfo() << mess;
          });

1.4 Fenêtres flottantes

Ajout de fenêtres flottantes

// Voir la documentation
QDockWidget* dockGit = new QDockWidget("Git");
QDockWidget* dockSolution = new QDockWidget("Gestionnaire de solutions");
QDockWidget* dockEquipe = new QDockWidget("Explorateur de ressources d'équipe");
QDockWidget* dockRessource = new QDockWidget("Vue des ressources");

addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea, dockGit);
addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea, dockSolution);
addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea, dockEquipe);
addDockWidget(Qt::DockWidgetArea::RightDockWidgetArea, dockRessource);

Division des fenêtres flottantes

splitDockWidget(dockGit, dockSolution, Qt::Orientation::Horizontal);

Ancrage avec onglets

tabifyDockWidget(dockSolution, dockEquipe);
tabifyDockWidget(dockEquipe, dockRessource);

  1. Menu contextuel

2.1 Menu contextuel

Lorsqu'on fait un clic droit sur le bureau, un menu apparaît. On l'appelle généralement menu contextuel. Comment l'utiliser dans Qt ?

D'abord, définir la stratégie de menu contextuel pour le contrôle setContextMenuPolicy(Qt::CustomContextMenu) ; ensuite, avec cette stratégie définie, lorsque nous cliquons avec le bouton droit sur le contrôle, Qt émet un signal customContextMenuRequested(const QPoint &pos), où le paramètre pos transmet les coordonnées de la souris au moment du clic droit, ces coordonnées sont généralement relatives au coin supérieur gauche du contrôle ; enfin, définir la fonction de slot correspondante à ce signal pour afficher le menu.

  • Définir la stratégie de menu contextuel
setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);  // Une fois défini, un menu contextuel par défaut est disponible

  • Connecter le signal de déclenchement du menu contextuel
connect(btn,&QPushButton::customContextMenuRequested,this,[=](const QPoint&pos)
{
    // Afficher le menu à la position spécifiée
    menuContextuel->exec(QCursor::pos());
});

  • Créer le menu
QMenu menuContextuel = new QMenu;
QAction* actionCopier = menuContextuel->addAction("Copier");
QAction* actionColler = menuContextuel->addAction("Coller");

Exemple

  • Définir le menu contextuel
  • Connecter le signal, obtenir les coordonnées du clic, définir l'affichage du menu
void menuContextuel()
{
        // Définir la stratégie de menu contextuel
        setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
        // Définir le menu
        _menuDroit = new QMenu(this);
        _menuDroit->addAction("Pomme");
        _menuDroit->addAction("Banane");
        _menuDroit->addAction("Poire");
        _menuDroit->addAction("Dattes");

        QObject::connect(this, &QWidget::customContextMenuRequested, [=](const QPoint& point) {
            qInfo() << "---------";
            // Conversion des coordonnées
            auto p = mapToGlobal(point);
            _menuDroit->popup(p);
            });
    }
protected:
// Événement de réponse au menu contextuel, mais ne se déclenche que si la stratégie de menu contextuel n'est pas définie
void eventMenuContextuel(QContextMenuEvent* ev)override
{
        qDebug() << "Menu contextuel affiché";
        _menuDroit->popup(ev->globalPos());
}
private:
    QPoint m_menuDroit;
    QMenu* _menuDroit;
};

Étiquettes: Qt QMainWindow interface graphique barre de menus barres d'outils

Publié le 8 juin à 18h26