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.
- QMainWindow
La structure de fenêtre standard la plus complexe par défaut
- Fournit une
barre de menus,barres d'outils,barre d'étatetfenê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);
- 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;
};