Académique Documents
Professionnel Documents
Culture Documents
Classe : L2IT
Date:19/12/2023
Enseignant: M. LOYA
TP n°5 de C++
Objectifs :
− Utiliser de la bibliothèque Qt pour créer, à l’aide de l’environnement QtCreator, des applications avec des interfaces
graphiques ;
− Apprendre à utiliser des classes existantes pour construire des applications
La bibliothèque Qt est surtout un ensemble de composants graphiques appelés widgets. Chaque type de
composants est défini par une classe. On distingue plusieurs catégories de composants :
− Widgets de haut niveau, widgets qui ne sont pas sur d’autres widgets c’est-à-dire qui n’ont pas de
widgets parents : Fenêtre, boîte de dialogue…
− Widgets de bas niveau, qui sont sur d’autres widgets c’est-à-dire qui ont des widgets parents :
Bouton, label, zone de texte, case à cocher, bouton radio…
− Composants invisibles : Actions, événements (par exemple, clic de souris), conteneur
Les widgets sont réutilisés dans les applications par :
− Héritage : extension d’un type de composants
− Composition : assemblage de composants
L’interaction entre les composants est gérée en Qt, par le mécanisme des « signaux/slots ». C’est un
mécanisme qui permet de relier librement les interfaces de composants.
− Un signal : c'est un message envoyé par un widget lorsqu'un évènement (clic souris, touche clavier…)
se produit.
− Un slot : c'est la fonction qui est appelée lorsqu'un évènement s'est produit. On dit que le signal
appelle le slot. Concrètement, un slot est une méthode d'une classe. Exemple : le slot quit() de la
classe QApplication provoque l'arrêt du programme.
Les signaux et les slots sont considérés par Qt comme des éléments d'une classe à part entière, en plus
des attributs et des méthodes.
Qt intègre un grand nombre de signaux et slots prédéfinis, mais il est possible de définir ses propres
slots et signaux. Les classes définissant des signaux ou des slots ne peuvent pas être compilées avec le
compilateur C++ habituel, il est nécessaire d’utiliser en premier lieu le compilateur moc(Meta Object
Compiler) : moc remplace tous les mots clefs spécifiques par des commandes et appels C++
implémentant le comportement voulu de l’objet.
La méthode statique QObject::connect permet d’associer un slot à un signal. Exemple : un clic sur un
bouton doit provoquer l'arrêt de l'application.
QObject::connect(
m_bouton, // pointeur vers le bouton qui va émettre le signal
SIGNAL(clicked()), // SIGNAL() est une macro du préprocesseur
qApp, // pointeur vers l'objet de type Qapplication créé dans le main
SLOT(quit())); // macro appelée lorsqu'on a cliqué sur le bouton
1
La méthode connect prend 4 arguments :
− un pointeur vers l'objet qui émet le signal
− le nom du signal que l'on souhaite « intercepter »
− un pointeur vers l'objet qui contient le slot récepteur
− le nom du slot qui doit s'exécuter lorsque le signal se produit
Toutes les classes de Qt héritent de QObject et toutes les classes widgets héritent de QWidget
2
Exercice 1
Objectifs :
On souhaite écrire une application qui permet de convertir les degrés Celcius en degrés en Farenheit et
vice versa à travers le formulaire suivant :
− Choisir les options Autre projet et Empty qmake Project (projet Qt vide) puis cliquer
sur choose…
3
− Taper le nom du projet (ici Convertisseur) et choisir l'emplacement où vous souhaitez
l'enregistrer puis cliquer Suivant>
4
− Cliquer sur Terminer
5
− Taper le nom de la classe MaFenetre
− Sélectionner Qwidget comme classe de base
− Vérifier que les options Include QWidget et Add Q_OBJECT sont cochées
− Cliquer sur Suivant > puis sur Terminer
Deux fichiers s’ajoutent alors au projet : mafenetre.h et mafenetre.cpp
3. Ajout au projet du fichier principal main.cpp
− Faire clic sur le nom du projet puis cliquer sur Add new (ou Ajouter nouveau)...
6
− Saisir le nom du fichier, ici main puis cliquer suivant> et Terminer
− Saisir dans ce fichier vide le code suivant pour créer et afficher un objet de MaFenetre.
#include <QApplication>
#include "mafenetre.h"
return a.exec();
}
− Exécuter le programme ; pour le moment la classe MaFenetre permet de créer des widgets
fenêtre vide.
7
class MaFenetre : public QWidget
{
Q_OBJECT//pour pouvoir définir des signaux et des slots
public:
explicit MaFenetre(QWidget *parent = nullptr);
signals:
};
return a.exec();
}
On va donc ajouter des attributs à la classe MaFenetre afin que les objets soient les formulaires attendus :
signals:
};
#endif // MAFENETRE_H 8
5. Définition de la classe MaFenetre
Pour le moment, le constructeur est la seule fonction membre de la classe.
Ouvrir le fichier mafenetre.cpp et compléter la définition du constructeur
#include "mafenetre.h"
#include<QHBoxLayout>
void MaFenetre::convertir()
{
switch (choixConversion->currentIndex()) {
case 0: resultat->setText(QString::fromUtf8("%1").arg(9 * valeur->text().toDouble()/5 +
32,0, 'f', 2));
unite->setText(QString::fromUtf8(" °F"));
break;
case 1: resultat->setText(QString::fromUtf8("%1").arg(5 * (valeur->text().toDouble() -
32)/ 9, 0, 'f', 2));
unite->setText(QString::fromUtf8(" °C"));
break;
}
}
8. Connexion signal/slot
Ouvrir le fichier mafenetre.cpp et compléter la définition du constructeur par :
// Connexion signal/slot :
connect(bConvertir, SIGNAL(clicked()), this, SLOT(convertir()));
connect(this, SIGNAL(actualiser()), this, SLOT(convertir()));
connect(choixConversion, SIGNAL(currentIndexChanged(int)), this, SLOT(permuter(int)));
connect(bQuitter, SIGNAL(clicked()), this, SLOT(close()));
9. Exécution du programme
Exercice 2
On souhaite écrire un programme qui effectue les quatre opérations +, -, *, / suivant la figure ci-dessous :
Travail demandé:
1. Création d'un projet Qt vide
Sélectionner Fichier > Nouveau fichier ou projet puis choisir les options Autre
projet et Empty qmake Project (projet Qt vide) puis cliquer sur choose…
Taper le nom du projet (par exemple calculatrice) et choisir l'emplacement où vous souhaitez
l'enregistrer puis cliquer Suivant> jusqu’à Terminer
2. Ajout du fichier principal main.cpp
Création d’un fichier dans lequel on va définir la fonction main :
Clic droit sur le nom du projet
3. Configuration du projet
Modifier le fichier calculatrice.pro en y ajouter la ligne QT += widgets pour avoir :
QT += widgets
10
SOURCES += \
main.cpp
Ensuite, exécuter qmake. Faire un clic droit sur le nom du projet et cliquer sur Exécuter qmake
4. Ajouter au projet la classe calcul, sous classe de QWidget formée des attributs dont les noms et
types suivent : _operande1 (QLineEdit), _operande2 (QLineEdit), _operateur
(QComboBox), _resultat (QLabel), _calculer (QPushButton), _quitter
(QPushButton). Le constructeur de QComboBox construit un widget vide, et il faut appeler
addItem pour rajouter les éléments, vous ajouterez 4 éléments à _operateur : + , - , * , / et vous
positionnerez les widgets dans la fenêtre calcul (de taille 450 sur 50).
5. Définir le constructeur afin créer le formulaire ci-dessus.
6. Écrire le programme principal qui instancie la fenêtre calcul et se termine quand la fenêtre est
fermée.
7. On va maintenant gérer le bouton _quitter afin qu’il quitte effectivement l’application. Dans le
constructeur de calcul, connecter le signal QPushButton::clicked de _quitter au slot
calcul::close de l’objet courant afin qu’un clic sur le bouton provoque une fermeture de la
fenêtre (et donc de l’application).
8. Passons au bouton _calculer. Commencer par définir un slot oncliccalculer (sans
arguments) et connecter ce slot au signal QPushButton::clicked de _calculer. Dans cette
méthode, on doit faire le calcul _operande1 _operateur _operande2. La méthode text de
QLineEdit retourne le texte saisi sous la forme d’une QString qu’il faut convertir en
std::string avec toStdString. std::stof convertit une std::string en float. Écrire dans
un premier temps le code qui définit deux variables de type float à partir des valeurs saisies par
l’utilisateur et les affiche sur la sortie standard. Attention std::stof ne fonctionne pas (en fait,
lève une exception) si la conversion ne peut pas être faite (chaîne vide, chaîne contenant autre chose
qu’un flottant). Nous ne prendrons en compte que le cas de la chaîne vide : faire en sorte qu’une
chaîne vide dans un widget opérande soit considérée comme la valeur 0.
9. Il faut maintenant faire le calcul, et pour cela récupérer le signe choisi dans _operateur . La
méthode currentText de QComboBox retourne le texte actuellement sélectionné. Faire le calcul
en fonction de l’opérateur choisi dans _operator. Le résultat du calcul est donc un float. Ce
float peut être converti en std::string par std::to_string, à son tour convertie en
QString par QString::fromStdString. La QString ainsi obtenue est utilisée pour changer
la valeur affichée par_resultat par un appel à setText.
Exercice 3
On souhaite développer une application Windows pour la gestion des articles en stock d’un magasin en
se basant sur les classes Article et ArticleEnSolde.
On dispose dans l’application d’un formulaire de gestion des articles. Le programme doit gérer une
collection des articles disponibles dans le stock.
11
Le formulaire de gestion des articles est représenté ci-dessous :
Travail demandé:
1. Création d'un projet Qt vide
Sélectionner Fichier > Nouveau fichier ou projet
12
Choisir les options Autre projet et Empty qmake Project (projet Qt vide) puis cliquer sur
choose…
Taper le nom du projet (par exemple gesStock) et choisir l'emplacement où vous souhaitez
l'enregistrer puis cliquer Suivant>
13
Cliquer sur Terminer
Le projet gesStock est créé et est constitué seulement d'un fichier .pro. Ce fichier, propre à Qt, sert à
configurer le projet au moment de la compilation.
2. Ajout du fichier principal main.cpp
Création d’un fichier dans lequel on va définir la fonction main :
Clic droit sur le nom du projet
14
Cliquer sur Suivant >
3. Configuration de Qt
Pour pouvoir utiliser les interfaces graphiques (fenêtres, boutons, …), il faut d'abord effectuer une petite
configuration de Qt. On va devoir lui dire en effet qu'on veut utiliser le module "QtWidgets" qui
permet d'afficher les interfaces graphiques. Pour cela :
15
Ouvrir le fichier gesStock.pro. Il devrait contenir la liste des fichiers du projet :
SOURCES += \
main.cpp
Y ajouter la ligne QT += widgets pour demander à Qt de charger le module QtWidgets :
QT += widgets
SOURCES += \
main.cpp
Ensuite, pour que Qt prenne en compte la modification du fichier gesStock.pro, il faut exécuter un
petit utilitaire appelé qmake. Faire un clic droit sur le nom du projet et cliquer sur Exécuter qmake
Tester la configuration en tapant dans le fichier main. cpp le programme ci-dessous et en l’exécutant :
#include <QApplication>
#include <QPushButton>
return app.exec();
}
Si la configuration est correcte, on doit voir à l’écran la fenêtre suivante :
16
Dans la boîte qui apparait, sélectionner C++> C++ Class
TAF
1°) Définir le constructeur afin créer le formulaire ci-dessus.
17
2°) Ecrire le code du slot on_fenArticle_loaded()qui s’exécute au chargement du formulaire
permettant de :
a. Remplir la liste déroulante catégorie par les valeurs « Informatique » et « Bureautique ».
b. Initialiser la zone de saisie prix par 0.
c. Désactiver la zone de saisie pourcentage de réduction.
3°) Ecrire le code du slot on_pushButtonAjouter_clicked() associé au clic du bouton Ajouter
Permettant de :
a. Vérifier si tous les champs sont remplis.
b. Vérifier si le prix entré par l’utilisateur est correct.
c. Vérifier si la remise entrée par l’utilisateur est correcte si le bouton Article en solde est
coché.
d. Vérifier si le code d’article entré par l’utilisateur n’existe pas dans la collection d’articles en
stock.
e. De créer un article avec les champs renseignés par l’utilisateur et l’ajouter à la collection
d’articles en stock.
f. De mettre à jour la grille.
4°) Ecrire le code du slot on_pushButtonSupprimer_clicked() associé au clic bouton
supprimer permettant de :
a. Vérifier si le champ code est rempli.
b. Si le code d’article renseigné dans le champ code correspond bien à un article dans la
collection.
c. D’afficher un message de confirmation « Voulez-vous vraiment supprimer l’article ? » à
l’utilisateur.
d. De supprimer l’article de la collection.
e. De mettre à jour la grille.
5°) Ecrire le code du slot on_checkBoxSolde_checked()associé au bouton à cocher Article en
solde permettant d’activer ou de désactiver le champ pourcentage de réduction selon
l’état du bouton à cocher.
6°) Ecrire le code du slot on_tableWidget_changeLine()associé au changement de la ligne
sélectionnée dans la grille permettant de :
a. Remplir les champs par les valeurs des propriétés de l’article sélectionné.
b. Tenir compte s’il s’agit d’un article en solde ou d’un article non soldé pour cocher ou
décocher le bouton Article en solde et afficher la remise.
7°) Ecrire le code slot associé au bouton Fermer permettant de quitter l’application après un message
de confirmation
Exercice 4
Le salaire net d’un employé d’une société se calcule de la manière suivante :
Le salaire net = Salaire brut – Valeur de l’impôt – Valeur de CNSS
Salaire brut = (Salaire de base + Prime de technicité + Prime de transport + Prime des enfants) *
Taux de travail
Taux de travail = Nombre de jours travaillés /26
la prime des enfants est définie comme suit :
▪ 0 si le nombre d’enfants est 0,
▪ 7000 si le nombre d’enfants est 1,
▪ 12000 si le nombre d’enfants est 2,
▪ 16000 si le nombre d’enfants est strictement supérieur à 2.
Valeur de l’Impôt = Taux de l’Impôt * Salaire Brut
Valeur de CNSS = Taux de CNSS * Salaire Brut
Taux CNSS = 26,5%
Taux de l'impôt = 0 si le salaire de base < 150 000
▪ Taux de l'impôt = 2% si le salaire de base [150000,250000[
▪ Taux de l'impôt = 5% si le salaire de base [250000,500000[
▪ Taux de l'impôt = 12% si le salaire de base >= 500 000.
Réaliser l’interface ci-dessous permettant la saisie d’un employé.
Pour cela :
1°) Créer une application graphique :
Fichier →Nouveau fichier ou projet …→ Application → Application Qt avec widgets →saisir
« GesSalaire » comme nom de projet et sélectionner le dossier → Taper « FenSalaire » comme de
la classe et sélectionner QWidget comme classe parent → Terminer
18
2°) Remarquer que dans « Projets » une rubrique « Formulaires» sous le projet qui vient être créé
3°) Ouvrir cette rubrique et noter qu’un fichier « FenSalaire.ui» y est inclus.
4°) Ouvrir FenSalaire en double cliquant dessus. La figue ci-dessous apparaît. L'application qui est
utilisée pour ce type de fichier s'appelle QtDesigner, elle permet de dessiner l'interface de
l’application en y ajoutant des éléments visuels : boutons, menus, .etc.)
19
title=Sexe
objectName=radioButtonMasculin
radioButtonMasculin QRadioButton
text=Masculin
objectName=radioButtonFeminin
radioButtonFeminin QRadioButton
text=Féminin
objectName=labelDateNaiss
labelDateNaiss QLabel
text=Date Naissance :
objectName=dateEditDateNaiss
dateEditDateNaiss QDateEdit buttonSymbols=NoButtons
date=01/01/2016
objectName=labelNombreEnf
labelNombreEnf QLabel
text=Nombre Enfants :
objectName=spinBoxnbEnf
spinBoxnbEnf QSpinBox
maximum=20
objectName=labelDateEmb
labelDateEmb QLabel
text=Date Embauche :
objectName=dateEditDateEmb
dateEditDateEmb QDateEdit
date=01/01/2016
objectName=labelCategorie
labelCategorie QLabel
text=Categorie :
objectName=comboBoxCategorie
comboBoxCategorie QComboBox editable=true
currenText=″″
objectName=lineFonction
lineEditFonction QLineEdit
text= ″″
objectName= groupBoxElSalaire
groupBoxElSalaire QGroupBox
title=Eléments du salaire
objectName= labelsalairebase
labelsalairebase QLabel
text=Salaire de base :
objectName= doubleSpinBoxSalairebase
doubleSpinBoxSalairebase QDoubleSpinBox buttonSymbols=NoButtons
maximum=1000000000
objectName= labelTechnicite
labelTechnicite QLabel
text=Technicité :
objectName= doubleSpinBoxTechnicite
doubleSpinBoxTechnicite QDoubleSpinBox buttonSymbols=NoButtons
maximum=1000000000
objectName= labelTransport
labelTransport QLabel
text=Transport :
objectName= doubleSpinBoxTransport
doubleSpinBoxTechnicite QDoubleSpinBox buttonSymbols=NoButtons
maximum=1000000000
objectName=labelNbJours
abelNbJours QLabel
text=Jours travaillés:
objectName=spinBox labelNbJours
spinBoxNbJrs QSpinBox
maximum=31
objectName =labelValQuotite
labelValQuotite QLabel frameshape : panel
text=″″
objectName : labelValPrimeEnfants
labelValPrimeEnfants QLabel frameShape : panel
text=″″
objectName =labelValBrut
labelValBrut QLabel frameShape : panel
text=″″
objectName = labelValCNSS
labelValCNSS QLabel frameShape : panel
text=″″
objectName = labelValIUTS
labelValIUTS QLabel
frameShape : panel
20
text=″″
objectName = pushButtonNouveau
pushButtonNouveau QPushButton
text=Nouveau
objectName = pushButtonCalculer
pushButtonCalculer QPushButton
text= Calculer Salaire
pushButtonQuitter QPushButton objectName = pushButtonQuitter
objectName= doubleSpinBoxSalairenet
enabled=false
doubleSpinBoxSalairenet QDoubleSpinBox
buttonSymbols=NoButtons
maximum=2000000000
6°) Associer au clic du boution Calculer salaire le slot de calculer du salaire net
21