Mon programme plante
Xetronn
Messages postés
52
Date d'inscription
Statut
Membre
Dernière intervention
-
d3rf -
d3rf -
Salut tout le monde,
Je suis en train de lire le cours sur le c++ du site openclassrooms et j'en suis au TP "zNavigo", mais j'ai un problème, mon programme plante. Je vous met mon code.
main.cpp
FenPrincipale.h
FenPrincipale.cpp
Je sais quel est la ligne qui fait crash mon programme mais je ne voit pas comment y remedier.
Merci d'avance.
Xetr0nn
Je suis en train de lire le cours sur le c++ du site openclassrooms et j'en suis au TP "zNavigo", mais j'ai un problème, mon programme plante. Je vous met mon code.
main.cpp
#include <QApplication> #include "FenPrincipale.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); FenPrincipale fenetre; fenetre.show(); return app.exec(); }
FenPrincipale.h
#ifndef FENPRINCIPALE_H #define FENPRINCIPALE_H #include <QMainWindow> #include <QtWebKitWidgets> #include <QWidget> #include <QMenu> #include <QMenuBar> #include <QAction> #include <QToolBar> #include <QLineEdit> #include <QTabWidget> #include <QStatusBar> #include <QProgressBar> class FenPrincipale : public QMainWindow { Q_OBJECT public: FenPrincipale(); QWebView *pageActuelle(); void creerBarreMenu(); void creerBarreOutils(); void creerZoneCentrale(); void creerBarreStatus(); public slots: void ouvrirNouvelOnglet(); void fermerOngletActuel(); /* void precedant(); void suivant(); void arreterChargement(); void actualiser(); */ void revenirAcceuil(); /* void rechercher(); void aPropos(); void aProposDeQt(); */ private: //Menu QMenu *m_menuFichier, *m_menuNavigation, *m_menuInterrogation; QAction *m_ouvrirNouvelOnglet, *m_fermerOngletActuel, *m_quitterProgramme, *m_precedent, *m_suivant, *m_arreterChargement, *m_actualiser, *m_revenirAcceuil, *m_rechercher, *m_aPropos, *m_aProposDeQt; //Barre d'outils QToolBar *m_barreOutils; QLineEdit *m_zoneDeRecherche; //Zone centrale QTabWidget *m_onglets; //Barre de status QStatusBar *m_barreStatus; QProgressBar *m_barreProgression; }; #endif // FENPRINCIPALE_H
FenPrincipale.cpp
#include "FenPrincipale.h" FenPrincipale::FenPrincipale() : QMainWindow() { creerBarreMenu(); creerBarreOutils(); creerZoneCentrale(); creerBarreStatus(); //connecteur QObject::connect(m_ouvrirNouvelOnglet, SIGNAL(triggered()), this, SLOT(ouvrirNouvelOnglet())); QObject::connect(m_fermerOngletActuel, SIGNAL(triggered()), this, SLOT(fermerOngletActuel())); QObject::connect(m_revenirAcceuil, SIGNAL(triggered()), this, SLOT(revenirAcceuil())); } //methodes //permet de pointer vers le QWebView ou l'on se situe QWebView *FenPrincipale::pageActuelle() { return m_onglets->currentWidget()->findChild<QWebView *>(); } //creation de la barre de menu void FenPrincipale::creerBarreMenu() { m_menuFichier = menuBar()->addMenu("Fichier"); m_menuNavigation = menuBar()->addMenu("Navigation"); m_menuInterrogation = menuBar()->addMenu("?"); //Actions du menu fichier m_ouvrirNouvelOnglet = new QAction("Ouvrir onglet", this); m_fermerOngletActuel = new QAction("Fermer onglet", this); m_quitterProgramme = new QAction("Quitter", this); m_menuFichier->addAction(m_ouvrirNouvelOnglet); m_menuFichier->addAction(m_fermerOngletActuel); m_menuFichier->addAction(m_quitterProgramme); //Actions du menu navigation m_precedent = new QAction("Précedent", this); m_precedent->setIcon(QIcon("icones/prec.png")); m_suivant = new QAction("Suivant", this); m_suivant->setIcon(QIcon("icones/suiv.png")); m_arreterChargement = new QAction("Arreter chargement", this); m_arreterChargement->setIcon(QIcon("icones/stop.png")); m_actualiser = new QAction("Actualiser", this); m_actualiser->setIcon(QIcon("icones/actu.png")); m_revenirAcceuil = new QAction("Revenir a l'acceuil", this); m_revenirAcceuil->setIcon(QIcon("icones/home.png")); m_rechercher = new QAction("Rechercher", this); m_rechercher->setIcon(QIcon("icones/go.png")); m_menuNavigation->addAction(m_precedent); m_menuNavigation->addAction(m_suivant); m_menuNavigation->addAction(m_arreterChargement); m_menuNavigation->addAction(m_actualiser); m_menuNavigation->addAction(m_revenirAcceuil); m_menuNavigation->addAction(m_rechercher); //Actions du menu point d'interrogation m_aPropos = new QAction("A propos", this); m_aProposDeQt = new QAction("A propos de Qt", this); m_menuInterrogation->addAction(m_aPropos); m_menuInterrogation->addAction(m_aProposDeQt); } //creation de la barre d'outils void FenPrincipale::creerBarreOutils() { m_zoneDeRecherche = new QLineEdit(this); m_barreOutils = addToolBar("Navigation"); m_barreOutils->setMovable(false); m_barreOutils->addAction(m_precedent); m_barreOutils->addAction(m_suivant); m_barreOutils->addAction(m_arreterChargement); m_barreOutils->addAction(m_actualiser); m_barreOutils->addAction(m_revenirAcceuil); m_barreOutils->addWidget(m_zoneDeRecherche); m_barreOutils->addAction(m_rechercher); } //creation de la zone centrale void FenPrincipale::creerZoneCentrale() { m_onglets = new QTabWidget(this); m_onglets->setMovable(true); this->setCentralWidget(m_onglets); } //creation de la barre d'état void FenPrincipale::creerBarreStatus() { m_barreProgression = new QProgressBar(this); m_barreStatus = statusBar(); m_barreStatus->addWidget(m_barreProgression); } //slots void FenPrincipale::ouvrirNouvelOnglet() { m_onglets->addTab(new QWidget, "Nouvel onglet"); } void FenPrincipale::fermerOngletActuel() { m_onglets->removeTab(m_onglets->currentIndex()); } void FenPrincipale::revenirAcceuil() { pageActuelle()->load(QUrl("www.google.fr")); //la ligne qui fait planter le programme }
Je sais quel est la ligne qui fait crash mon programme mais je ne voit pas comment y remedier.
Merci d'avance.
Xetr0nn
A voir également:
- Mon programme plante
- Plante - Guide
- Programme demarrage windows - Guide
- Mon telephone plante que faire - Guide
- Message programmé iphone - Guide
- Mettre en veille un programme - Guide
4 réponses
Et quelle est donc cette ligne ?
Xetronn
Messages postés
52
Date d'inscription
Statut
Membre
Dernière intervention
1
Dans la methode "revenirAcceuil"
La méthode en question est bonne. L'erreur doit venir d'autre part et faire bugger ton truc.
Pense a vérifier si pageActuelle est déclaré correctement.
Bonne chance.
Pense a vérifier si pageActuelle est déclaré correctement.
Bonne chance.
Bonsoir
Alors, pour commencer il n'y a pas mal d'oublier ou survolage des notions POO en C++ et ça, même avec qt. Peut-être que je suis dans l'erreur pour Qt mais pas pour le C++.
déjà, un constructeur instancie l'objet et le destructeur libère la ressource allouée, alors dit moi, sachant que tu fais des news de tes attribues un peut partout dans ton programme, à quel moment tu les désalloues (rend la mémoire au système), je ne pense pas que Qt est doté de systèmes ramasse-miettes pour free toutes tes allocations, si s'était le cas en le saurait déjà.
Sans destructeur ,libération de mémoire en va droite aux fuites mémoire et au comportement non acceptable de ton programme bref.
Autre point, ta fonction d'ajout d'onglet n'est pas correct, tu ne vas pas faire un new d'objet, mais plutôt un ajout d'objet préalablement instancier ton code:
que ça
avec les parametre bien définie dans la fonction fCreateOnglet
et ergonomie de ton code pas futé il est préférable de faire une fonction qui comporte la définition des icônes des boutton, et une autre pour les boutons et actions pour les initialisation et configurer. Ainsi, si tu à une erreur d'icône il est plus facile pour toi de savoir d'où ça viens.
Quand tu déclare Q_OBJECT dans ton programme il est plus vitale de mettre des QObject à tes slots car c'est une sorte de déclarations référentiel enfin un pseudo espace de nom de type
no , il retourne l'objet enfant contenu dans le parent c'est pas parce qu'il y a des
sachant que la plus part vient des widget alors autant faire
mais Attention je n'est pas dit que ce que tu a fait est faux
à bientôt
Alors, pour commencer il n'y a pas mal d'oublier ou survolage des notions POO en C++ et ça, même avec qt. Peut-être que je suis dans l'erreur pour Qt mais pas pour le C++.
déjà, un constructeur instancie l'objet et le destructeur libère la ressource allouée, alors dit moi, sachant que tu fais des news de tes attribues un peut partout dans ton programme, à quel moment tu les désalloues (rend la mémoire au système), je ne pense pas que Qt est doté de systèmes ramasse-miettes pour free toutes tes allocations, si s'était le cas en le saurait déjà.
Sans destructeur ,libération de mémoire en va droite aux fuites mémoire et au comportement non acceptable de ton programme bref.
Autre point, ta fonction d'ajout d'onglet n'est pas correct, tu ne vas pas faire un new d'objet, mais plutôt un ajout d'objet préalablement instancier ton code:
,
m_onglets->addTab(new QWidget, "Nouvel onglet");
que ça
m_onglets = new QTabWidget; m_onglets->addTab(fCreeOnglet(tr("zzzzzzz.com")), tr("(Nouvelle page/Onglet)"));
avec les parametre bien définie dans la fonction fCreateOnglet
et ergonomie de ton code pas futé il est préférable de faire une fonction qui comporte la définition des icônes des boutton, et une autre pour les boutons et actions pour les initialisation et configurer. Ainsi, si tu à une erreur d'icône il est plus facile pour toi de savoir d'où ça viens.
Quand tu déclare Q_OBJECT dans ton programme il est plus vitale de mettre des QObject à tes slots car c'est une sorte de déclarations référentiel enfin un pseudo espace de nom de type
unsing namespace std
//permet de pointer vers le QWebView ou l'on se situe QWebView *FenPrincipale::pageActuelle() { return m_onglets->currentWidget()->findChild<QWebView *>(); }
no , il retourne l'objet enfant contenu dans le parent c'est pas parce qu'il y a des
->/code> que cela veut systématiquement dire qu'il pointe <code cpp> #include <QMainWindow> #include <QtWebKitWidgets> #include <QWidget> #include <QMenu> #include <QMenuBar> #include <QAction> #include <QToolBar> #include <QLineEdit> #include <QTabWidget> #include <QStatusBar> #include <QProgressBar>
sachant que la plus part vient des widget alors autant faire
#include <QtCore> #include <QtGui> #include <QtNetwork> #include <QtWidget/QtWidget>
mais Attention je n'est pas dit que ce que tu a fait est faux
à bientôt