Bonjour à tous.
Je débute le C++ en suivant le cours "Programmez avec le langage C++". J'en suis à la 3° partie consistant à utiliser Qt pour les interfaces graphiques.
L'objet du TP est de réaliser un générateur de code de base des classes C++. Sans grande ambition, juste deux fenêtres, d'ailleurs je n'en suis pas si loin. J'ai créé la première partie du TP, jusqu'à ce point où je bloque et j'aimerais bien le solutionner avant de continuer.
Voici mon main l'application étant dénommée "generateurDeClasse".
Voici l'entête de la classe fenprincipale.h (tous les include ne sont pas encore utilisés) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include <QApplication> #include "fenprincipale.h" int main(int argc, char *argv[]) { QApplication generateurDeClasse(argc, argv); FenPrincipale mainWindows; return generateurDeClasse.exec(); }
Et voici le source de la classe fenprincipale.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #ifndef FENPRINCIPALE_H #define FENPRINCIPALE_H #include <QWidget> #include <QLineEdit> #include <QFormLayout> #include <QVBoxLayout> #include <QGroupBox> #include <QGridLayout> #include <QRadioButton> #include <QCheckBox> #include <QPushButton> #include <QMenu> #include <QDateEdit> #include <QTextEdit> #include <QDate> #include <stdlib.h> class FenPrincipale : public QWidget { Q_OBJECT public: explicit FenPrincipale(QWidget *parent = 0); signals: public slots: private: QGroupBox *groupSup(); QGroupBox *groupMid(); QGroupBox *groupInf(); }; #endif // FENPRINCIPALE_H
J'aime bien cette structure visant à appeler des fonctions dans la classe (groupSup, groupMid, groupInf) pour constituer l'organisation de la structure de la fenêtre principale.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 #include "fenprincipale.h" FenPrincipale::FenPrincipale(QWidget *parent) : QWidget(parent) { //Création d'un arrangement selon une grille de 3 lignes x 1colonne QGridLayout *grille = new QGridLayout; grille->addWidget(groupSup(), 0, 0); grille->addWidget(groupMid(), 1, 0); grille->addWidget(groupInf(), 2, 0); //Création des boutons QPushButton *boutonQuitter = new QPushButton("Quitter"); QWidget::connect(boutonQuitter, SIGNAL(clicked()), generateurDeClasse, SLOT(quit())); QPushButton *boutonGenerer = new QPushButton("Générer !"); //Création d'un arrangement selon une grille de 1 ligne x 4colonnes QGridLayout *grilleBas = new QGridLayout; grilleBas->addWidget(boutonQuitter,0,4); grilleBas->addWidget(boutonGenerer,0,3); //Création de l'arrangement principal vertical QVBoxLayout *layoutPrincipal = new QVBoxLayout; //Définition de l'arrangement principal layoutPrincipal->addLayout(grille); // Ajout du layout grille layoutPrincipal->addLayout(grilleBas); //On affecte l'arrangement principal à la fenêtre setLayout(layoutPrincipal); setWindowTitle(tr("Zero Class Generator")); resize(480, 600); show(); } QGroupBox *FenPrincipale::groupSup() { QGroupBox *groupBox = new QGroupBox(tr("&Définition de la classe")); QLineEdit *nom = new QLineEdit; QLineEdit *prenom = new QLineEdit; QFormLayout *layoutSup = new QFormLayout; layoutSup->addRow("&Nom : ", nom); layoutSup->addRow("Classe &mère : ", prenom); groupBox->setLayout(layoutSup); return groupBox; } QGroupBox *FenPrincipale::groupInf() { QGroupBox *groupBox = new QGroupBox(tr("A&jouter des commentaires")); groupBox->setCheckable(true); groupBox->setChecked(false); QLineEdit *auteur = new QLineEdit; auteur->setText(getenv("USERNAME")); QDateEdit *creation = new QDateEdit; creation->setDate(QDate::currentDate()); QTextEdit *role = new QTextEdit; QFormLayout *layoutInf = new QFormLayout; layoutInf->addRow("&Auteur : ", auteur); layoutInf->addRow("Da&te de création : ", creation); layoutInf->addRow("&Rôle de la classe : ",role); groupBox->setLayout(layoutInf); return groupBox; } QGroupBox *FenPrincipale::groupMid() { QGroupBox *groupBox = new QGroupBox(tr("&Options")); // groupBox->setFlat(true); QCheckBox *checkBox1 = new QCheckBox(tr("Protéger le &header contre les inclusions multiples")); checkBox1->setChecked(true); QCheckBox *checkBox2 = new QCheckBox(tr("Générer un &constructeur par défaut")); checkBox2->setChecked(true); QCheckBox *checkBox3 = new QCheckBox(tr("Générer un &destructeur")); QVBoxLayout *vbox = new QVBoxLayout; vbox->addWidget(checkBox1); vbox->addWidget(checkBox2); vbox->addWidget(checkBox3); groupBox->setLayout(vbox); return groupBox; }
Bien sûr, j'ai simplement adapté l'exemple que j'ai repris de la documentation Qt. (merci à eux pour cette documentation vraiment exhaustive et compréhensible).
Après avoir constaté le bon fonctionnement de la création de la fenêtre, j'ai voulu activer le bouton quitter. Et là, le bât blesse sur la connexion :
L'affectation directe à l'application generateurDeClasse, génère le message d'erreur suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 QWidget::connect(boutonQuitter, SIGNAL(clicked()), generateurDeClasse, SLOT(quit()));
Et ça me parait tout à fait normal car dans la classe, il me semble que l'application n'est pas accessible/visible (mais je me trompe peut-être). D'ailleurs "generateurDeClasse" n'est pas proposé en auto-complétion du code. Donc il doit manquer une référence quelque-part. J'ai bien essayé avec un "this", mais ça ne fonctionne pas non plus.fenprincipale.cpp:15: erreur : 'generateurDeClasse' was not declared in this scope
QWidget::connect(boutonQuitter, SIGNAL(clicked()), generateurDeClasse, SLOT(quit()));
Or dans le corrigé (où l'application est dénommée qApp), l'affectation est directe, comme cela :
Pourriez-vous m'éclairer sur la raison qui fait que ça ne fonctionne pas chez moi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 FenPrincipale::FenPrincipale() { // Création des layouts et des widgets // // Connexions des signaux et des slots connect(quitter, SIGNAL(clicked()), qApp, SLOT(quit())); }
Par avance, merci.
Partager