IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Classe qui fait cesser de fonctionner mon programme


Sujet :

Qt

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut Classe qui fait cesser de fonctionner mon programme
    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 :
    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
    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
    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.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
    #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
    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
    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.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
    #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
    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
    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);
    }
    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.

    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();
    }

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Oui, à vue d’œil l'erreur est assez évidente, mais c'est beaucoup plus simple de la trouver toi-même grâce au débuggage.

    Tu devrais tomber sur la ligne 13 de PageOptions.cpp où tu essayes d'appeler une méthode sur parentWidget() alors que tu crées à coup sûr une PageOptions sans parent (appel du constructeur de QWidget sans paramètre).

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Franchement j'avais pas du tout fait attention à cette erreur.
    Merci beaucoup

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Le message c'est surtout : utilise le debugger. Les erreurs comme ça on en fait tous...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 08/11/2011, 17h07
  2. Réponses: 22
    Dernier message: 12/05/2010, 23h19
  3. Réponses: 13
    Dernier message: 02/11/2006, 15h12
  4. [POO] Une classe qui fait tout ?
    Par Nasky dans le forum Langage
    Réponses: 23
    Dernier message: 26/05/2006, 20h02
  5. [JAR] pb class qui fait référence à un fichier property
    Par yanagiba dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/08/2005, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo