|
|
|
|
Bonjour,
Je met au point un petit bloc notes. J'ai fait mon code en C++ pour que dans le menu il y ait "nouveau document" et qu'il ouvre un nouvel onglet. Le programme se compile mais quand je vais dans le menu et que je clique sur "nouveau" la il plante et il me donne l'erreur APP CRASH. Il y a un problème dans le code C++.
Le voici :
MaFenetre.cpp
<code type="cpp">
#include <QApplication>
#include <QPushButton>
#include <QInputDialog>
#include <QAction>
#include <QtGui>
#include <QWidget>
#include <windows.h>
#include <shellapi.h>
#include "MaFenetre.h"
MaFenetre::MaFenetre() : QMainWindow()
{
// Définition de la MDI
QMdiArea *zoneCentrale = new QMdiArea;
QTextEdit *zoneTexte1 = new QTextEdit;
QMdiSubWindow *sousFenetre1 = zoneCentrale->addSubWindow(zoneTexte1);
zoneCentrale->setViewMode(QMdiArea::TabbedView);
sousFenetre1->setWindowTitle("Nouveau Document");
sousFenetre1->setWindowIcon(QIcon(QLatin1String("doc.png")));
setCentralWidget(zoneCentrale);
// Définition des paramètres de la fenêtre
setMinimumSize(600, 400);
setWindowIcon(QIcon(QLatin1String("default.png")));
setWindowTitle("NotePad!");
setWindowOpacity(0.95);
// Création des menus
QMenu *menuFichier = menuBar()->addMenu("Fichier");
// Création des actions pour les menus
QAction *actionNew = menuFichier->addAction("Nouveau");
actionNew->setShortcut(QKeySequence("Ctrl+N"));
actionNew->setIcon(QIcon("plus.png"));
QAction *actionQuitter = menuFichier->addAction("&Quitter");
actionQuitter->setShortcut(QKeySequence("Ctrl+Q"));
actionQuitter->setIcon(QIcon("quitter.png"));
// Création de la toolbar
QToolBar *toolBarFichier = addToolBar("Fichier");
toolBarFichier->addAction(actionNew);
toolBarFichier->addAction(actionQuitter);
// Connection des signaux et des slots
connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));
connect(actionNew, SIGNAL(triggered()), this, SLOT(nouveauDoc()));
}
void MaFenetre::nouveauDoc()
{
QTextEdit *zoneTexte1 = new QTextEdit;
QMdiSubWindow *sousFenetre1 = zoneCentrale->addSubWindow(zoneTexte1);
}
</code>
Le header
<code type="cpp">
#include <QAction>
#include <QPushButton>
#include <QMessageBox>
#include <QInputDialog>
#include <windows.h>
#include <shellapi.h>
#include <QtGui>
class MaFenetre : public QMainWindow
{
Q_OBJECT
public:
MaFenetre();
public slots:
void nouveauDoc();
private:
QMenu *menuFichier;
QAction *actionNew;
QAction *actionQuitter;
QMdiArea *zoneCentrale;
QTextEdit *zoneTexte1;
QMdiSubWindow *sousFenetre1;
QToolBar *toolBarFichier;
};
</code>
Le main :
<code type="cpp">
#include <QApplication>
#include <QTranslator>
#include <QLocale>
#include <QLibraryInfo>
#include "MaFenetre.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QString locale = QLocale::system().name();
QTranslator translator;
translator.load(QString("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&translator);
MaFenetre fenetre;
fenetre.show();
return app.exec();
}
</code>
Merci de votre aide .
Merci de marquer vos sujets comme résolus quand ils l'ont été. Configuration: Windows Vista
Firefox 3.0.6
Pas de grosse modif à faire mais une difficulté à utiliser les pointeurs...
void MaFenetre::nouveauDoc()
{
QTextEdit *zoneTexte1 = new QTextEdit;
QMdiSubWindow *sousFenetre1 = zoneCentrale->addSubWindow(zoneTexte1);
}Pourquoi mettre zoneTexte1 et sousFenetre1... c'est autorisé mais pour la conpréhension c'est pas terrible car ce sont les mêmes noms que ceux qui sont utilisés dans la définition de la classe, Enfin passons à la suite.
Dans cette fonction tu utilises 'zoneCentrale', mais 'zoneCentrale' n'a jamais été initialisé!!! Je répète 'zoneCentrale' n'a jamais été initialisé... certes 'zoneCentrale' a été défini dans la classe comme QMdiArea *zoneCentrale; mais jamais initialisé... oh, je te vois venir en disant: Mais dans le constructeur, j'ai mis: QMdiArea *zoneCentrale = new QMdiArea; , et je réponds: Dans le constructeur tu définis une variable 'zoneCentrale' qui n'a rien à voir avec celle définie dans la classe donc celle de la classe ne sera pas initialisée et en ce qui concerne celle qui est initialisée son pointeur est perdu. Si tu veux t'en persuader, dans le constructeur, remplace QMdiArea *zoneCentrale = new QMdiArea; par zoneCentrale = new QMdiArea; et ça devrait fonctionner. Ai-je été suffisamment clair ? |
Padon j'ai résolue le truc. Par contre j'ai un autre problème.
|