Mon programme plante

Xetronn Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   -  
 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

#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:

4 réponses

e666 Messages postés 470 Date d'inscription   Statut Membre Dernière intervention   175
 
Et quelle est donc cette ligne ?
0
Xetronn Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   1
 
Dans la methode "revenirAcceuil"
0
Xetronn Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   1
 
vraiment personnes ?
0
Ligiara Messages postés 9 Date d'inscription   Statut Membre Dernière intervention   3
 
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.
0
sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   49
 
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:

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
0
Xetronn Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   1
 
Et bien je te remercie de cette reponse. Et si je crois que Qt a un ramasse miette mais merci quand meme je vais essayer tout sa :)
0
d3rf
 
bonjour, peut-étre le faites qu'aucun QWebView n'a étaient créer et que tu recherche le QWebView enfant dans l'onglet courant alors qu'il n'y a pas encore d'onglets, je pense, je debute aussii.
0