Bonjour à tous.
Je viens vous demander un peu d'aide car mon programme utilisant Qt compile bien mais cesse de fonctionner.
J'ai une classe FenetrePrincipale qui correspond à la fenêtre de mon programme, et deux classes PageMenuPrincipal et PageOptions qui sont deux "écrans" différents qui peuvent être affichés dans la fenêtre.
Voici le code :
PageMenuPrincipal.hpp :
PageMenuPrincipale.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 #ifndef _PAGEMENUPRINCIPAL #define _PAGEMENUPRINCIPAL #include <QApplication> #include <QPushButton> #include <QVBoxLayout> #include "FenetrePrincipale.hpp" #include "PageOptions.hpp" class PageOptions; class FenetrePrincipale; class PageMenuPrincipal : public QWidget { Q_OBJECT public : PageMenuPrincipal(FenetrePrincipale* fenetrePrincipale); public slots : void afficherMenuSolo(); void afficherMenuMultijoueur(); void afficherPageOptions(); private : FenetrePrincipale *m_fenetrePrincipale; PageOptions *m_pageOptions; }; #endif
PageOptions.hpp :
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 #include "PageMenuPrincipal.hpp" PageMenuPrincipal::PageMenuPrincipal(FenetrePrincipale* fenetrePrincipale) : QWidget(), m_fenetrePrincipale(fenetrePrincipale) { // layout principal QPushButton *menuSolo = new QPushButton("Solo"); menuSolo->setObjectName("Menu"); QPushButton *menuMultijoueur = new QPushButton("Multijoueur"); menuMultijoueur->setObjectName("Menu"); QPushButton *menuOptions = new QPushButton("Options"); menuOptions->setObjectName("Menu"); QPushButton *menuQuitter = new QPushButton("Quitter"); menuQuitter->setObjectName("Menu"); QVBoxLayout *layoutPrincipal = new QVBoxLayout; layoutPrincipal->setAlignment(Qt::AlignCenter); layoutPrincipal->addWidget(menuSolo); layoutPrincipal->addWidget(menuMultijoueur); layoutPrincipal->addWidget(menuOptions); layoutPrincipal->addWidget(menuQuitter); setLayout(layoutPrincipal); connect(menuSolo, SIGNAL(clicked()), this, SLOT(afficherMenuSolo())); connect(menuMultijoueur, SIGNAL(clicked()), this, SLOT(afficherMenuMultijoueur())); connect(menuOptions, SIGNAL(clicked()), this, SLOT(afficherPageOptions())); connect(menuQuitter, SIGNAL(clicked()), m_fenetrePrincipale, SLOT(close())); // autres pages m_pageOptions = new PageOptions(m_fenetrePrincipale); m_fenetrePrincipale->ajouterPage(this, 0); } void PageMenuPrincipal::afficherMenuSolo() { } void PageMenuPrincipal::afficherMenuMultijoueur() { } void PageMenuPrincipal::afficherPageOptions() { m_fenetrePrincipale->afficherPage(1); }
PageOptions.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 #ifndef _PAGEOPTIONS #define _PAGEOPTIONS #include <QWidget> #include <QComboBox> #include <QCheckBox> #include <QPushButton> #include <QFormLayout> #include <QHBoxLayout> #include <QVBoxLayout> #include <QSettings> #include <QFile> #include "FenetrePrincipale.hpp" class FenetrePrincipale; class PageOptions : public QWidget { Q_OBJECT public : PageOptions(FenetrePrincipale* fenetrePrincipale); public slots : void enregistrerOptions(); private : QSettings m_fichierOptions; FenetrePrincipale *m_fenetrePrincipale; QComboBox *m_listeStyle; QCheckBox *m_casePleinEcran; }; #endif
FenetrePrincipale.hpp :
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 #include "PageOptions.hpp" PageOptions::PageOptions(FenetrePrincipale* fenetrePrincipale) : QWidget(), m_fichierOptions("Options", QSettings::IniFormat), m_fenetrePrincipale(fenetrePrincipale) { // layout des options m_listeStyle = new QComboBox; m_listeStyle->addItem("Defaut Noir"); m_listeStyle->addItem("Defaut Blanc"); m_casePleinEcran = new QCheckBox; parentWidget()->isFullScreen() ? m_casePleinEcran->setChecked(true) : m_casePleinEcran->setChecked(false); QFormLayout *layoutFormulaireOptions = new QFormLayout; layoutFormulaireOptions->addRow("Style :", m_listeStyle); layoutFormulaireOptions->addRow("Plein écran :", m_casePleinEcran); // layout des boutons QPushButton *boutonAppliquer = new QPushButton("Appliquer"); QPushButton *boutonAnnuler = new QPushButton("Retour"); QHBoxLayout *layoutBoutons = new QHBoxLayout; layoutBoutons->addWidget(boutonAppliquer); layoutBoutons->addWidget(boutonAnnuler); connect(boutonAppliquer, SIGNAL(clicked()), this, SLOT(enregistrerOptions())); connect(boutonAnnuler, SIGNAL(clicked()), this, SLOT(afficherPageMenuPrincipal())); // layout principal QVBoxLayout *layoutPrincipal = new QVBoxLayout; layoutPrincipal->setAlignment(Qt::AlignCenter); layoutPrincipal->addLayout(layoutFormulaireOptions); layoutPrincipal->addLayout(layoutBoutons); setLayout(layoutPrincipal); m_fenetrePrincipale->ajouterPage(this, 1); } void PageOptions::enregistrerOptions() { // enregistrement des options m_fichierOptions.setValue("Style", m_listeStyle->currentText()); m_fichierOptions.setValue("PleinEcran", m_casePleinEcran->isChecked()); // application des options QFile fichierStyle("Styles/" + m_listeStyle->currentText() + "/" + m_listeStyle->currentText() + ".css"); fichierStyle.open(QIODevice::ReadOnly); m_fenetrePrincipale->setStyleSheet(fichierStyle.readAll()); m_casePleinEcran->isChecked() ? parentWidget()->showFullScreen() : parentWidget()->showNormal(); m_fenetrePrincipale->afficherPage(0); }
FenetrePrincipale.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 #ifndef _FENETREPRINCIPALE #define _FENETREPRINCIPALE #include <QWidget> #include <QStackedLayout> #include <QFile> #include <QSettings> #include <QCloseEvent> #include "PageMenuPrincipal.hpp" class FenetrePrincipale : public QWidget { Q_OBJECT public : FenetrePrincipale(); void closeEvent(QCloseEvent *event); void ajouterPage(QWidget* page, int numeroPage); void afficherPage(int page); private : QSettings m_fichierOptions; QString m_style; bool m_pleinEcran; QStackedLayout *layoutPrincipal; }; #endif
Si je retire la classe PageOptions du projet, le programme s'exécute correctement et sans planter. Autrement j'ai un "a cessé de fonctionner" lors du lancement du programme.
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 #include "FenetrePrincipale.hpp" FenetrePrincipale::FenetrePrincipale() : QWidget(), m_fichierOptions("Options", QSettings::IniFormat), m_style(m_fichierOptions.value("Style", "Defaut Noir").toString()), m_pleinEcran(m_fichierOptions.value("PleinEcran", true).toBool()) { // affichage de la fenêtre QFile fichierStyle("Styles/" + m_style + "/" + m_style + ".css"); fichierStyle.open(QIODevice::ReadOnly); setStyleSheet(fichierStyle.readAll()); resize(m_fichierOptions.value("LargeurFenetre", 600).toInt(), m_fichierOptions.value("HauteurFenetre", 400).toInt()); m_fichierOptions.value("PleinEcran", true).toBool() ? showFullScreen() : showNormal(); // affichage du menu principal layoutPrincipal = new QStackedLayout; setLayout(layoutPrincipal); PageMenuPrincipal *menuPrincipal = new PageMenuPrincipal(this); afficherPage(0); } void FenetrePrincipale::closeEvent(QCloseEvent *event) { // enregistrement de la taille de la fenêtre if (!isFullScreen()) { m_fichierOptions.setValue("LargeurFenetre", width()); m_fichierOptions.setValue("HauteurFenetre", height()); } event->accept(); } void FenetrePrincipale::ajouterPage(QWidget* page, int numeroPage) { layoutPrincipal->insertWidget(numeroPage, page); } void FenetrePrincipale::afficherPage(int numeroPage) { layoutPrincipal->setCurrentIndex(numeroPage); }
Pourriez vous me dire d'où vient l'erreur ?
Merci d'avance.
PS : je doute que le problème vienne de là, mais voici le main.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #include <QApplication> #include "GUI/FenetrePrincipale.hpp" int main(int argc, char *argv[]) { QApplication application(argc, argv); FenetrePrincipale fenetrePrincipale; fenetrePrincipale.show(); return application.exec(); }
Partager