Mon programme plante
Xetronn
Messages postés
60
Statut
Membre
-
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
- Programme word gratuit - Guide
- Message programmé iphone - Guide
4 réponses
Et quelle est donc cette ligne ?
Xetronn
Messages postés
60
Statut
Membre
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