[Qt] C++ Nouveau Document

Résolu/Fermé
Profil bloqué - 22 févr. 2009 à 23:14
 Profil bloqué - 23 févr. 2009 à 19:30
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 .

8 réponses

Pas de grosse modif à faire mais une difficulté à utiliser les pointeurs...
Une remarque préliminaire dans la fonction suivante:
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 ?
2
Profil bloqué
23 févr. 2009 à 17:01
oui merci
0
Profil bloqué
23 févr. 2009 à 17:08
je n'ai pas tout à fait compris, pourrais tu me redonner le code exact stp ?


merci d'avance
0
Profil bloqué
23 févr. 2009 à 17:10
j'ai trouvé !
merci beaucoup !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Profil bloqué
23 févr. 2009 à 17:12
Ah... il y a un problème... Ca ne m'ouvre seulement qu'un onglet! Il ne m'ouvre pas une autre zone de texte !

Aidez moi !
0
Et en faisant "Menu Fichier / Nouveau", il n'y a pas un nouvel onglet ?
0
Profil bloqué
23 févr. 2009 à 18:22
Padon j'ai résolue le truc. Par contre j'ai un autre problème.

j'ai lu <a href="https://openclassrooms.com/forum/sujet/qt-ouvrir-et-enregistrer-au-format-txt-61189">ce sujet dans le forum</a> mais pour ouvrir et enregistrer au format txt Mais quand je compile avec le code donné sur l'autre sujet, le compilo me donne cet erreur :
Compileur Qt:

MaFenetre.cpp:65:error "filename" undeclared(first use this function)

Et d'autres erreur de déclaration. Mais je ne sais pas ce quil faut déclarer ! Pouvez vous m'aider S'il vous plaît !


Voici mon code :

Main.cpp(il n'a pas changé ) !

#include <QApplication>
#include <QTranslator>
#include <QLocale>
#include <QLibraryInfo>
#include "MaFenetre.h"


int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QString locale = "fr_FR";
QTranslator translator;
translator.load(QString("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&translator);

MaFenetre fenetre;
fenetre.show();

return app.exec();
}




MaFenetre.cpp

#include "MaFenetre.h"

MaFenetre::MaFenetre() : QMainWindow()
{
// Définition de la MDI
textEdit = new QTextEdit(this);
setCentralWidget(textEdit);
textEdit->setFocus();

// 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("new.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(quitter()));
connect(actionNew, SIGNAL(triggered()), this, SLOT(nouveauDoc()));
}

void MaFenetre::nouveauDoc()
{
int reponse = QMessageBox::question(this, "Continuer", "Etes-vous sur de vouloir créer un nouveau document ? - <b>Note :</b> Il remplacera le document en cours.", QMessageBox::Yes | QMessageBox::No);
if(reponse == QMessageBox::Yes)
{
textEdit->clear();
}
else{
}
}

void MaFenetre::quitter()
{
int reponse = QMessageBox::question(this, "Quitter", "Voulez-vous sauvegarder avant de quitter ?", QMessageBox::Yes | QMessageBox::No |QMessageBox::Cancel);
if(reponse == QMessageBox::Yes)
{
return saveAs();
}
else if(reponse == QMessageBox::No)
{

}
else{
}
}

bool MaFenetre::save()
{
if (sansNom)
return saveAs();
else
return write();
}

bool MaFenetre::saveAs()
{
fileName = QFileDialog::getSaveFileName(0, tr("Enregistrer Sous"));
if (fileName.isEmpty()) // Si c'est vide, donc si on a annulé
return false;

/*QFileInfo info(fileName);
if (info.suffix() == "")
fileName += ".txt";*/ // T'occupes

//sansNom = false;

return write();
}

bool MaFenetre::write()
{
QFile file(fileName);
if (!file.open(QFile::WriteOnly | QFile::Text))
{
QMessageBox::warning(this, tr("Zeditor"),
tr("Impossible d'enregistrer le fichier %1:\n%2.")
/*.arg(fileName)
.arg(file.errorString())*/);
return false;
}

QTextStream out(&file);
QApplication::setOverrideCursor(Qt::WaitCursor); // Curseur à wait
out << text(); // Pour un QsciSintilla, pour toit ça doit être toPlainText()
QApplication::restoreOverrideCursor();

//setModified(false);

return true;
}

Et le header :


#include <QWidget>
#include <QFile>
#include <QFileDialog>
#include <QFileInfo>
#include <QAction>
#include <QPushButton>
#include <QtGui>
#include <QFile>
#include <QFileDialog>
#include <qfile.h>
#include <QString>
#include <QWidget>
#include <QMessageBox>
#include <QAction>
#include <QApplication>
#include <QPushButton>
#include <QInputDialog>
#include <QAction>
#include <QtGui>
#include <QWidget>
#include <windows.h>
#include <shellapi.h>
#include <QPushButton>
#include <QMessageBox>
#include <QInputDialog>
#include <QTextEdit>
#include <windows.h>
#include <shellapi.h>
#include <QtGui>

class MaFenetre : public QMainWindow
{
Q_OBJECT

public:
MaFenetre();

private:
bool save();
bool saveAs();
bool write();

public slots:
void nouveauDoc();
void quitter();

private:
QMenu *menuFichier;
QAction *actionNew;
QAction *actionQuitter;
QTextEdit *textEdit;
QToolBar *toolBarFichier;
};


Merci d'avance !
0
Je vois que tu as abandonné les 'MDI'.
J'au du mal à lire le code car il n'est pas indenté; pour cela il faut utiliser les balises (on trouve les balises gras, italique, souligné, code et lien).
Ceci étant il faut évidemment définir 'fileName'; c'est un QString à mettre dans la fonction, mais en fait il est plus judicieux de mettre cette déclaration dans la classe car cela permet, lorsqu'on ouvre un fichier, d'en conserver le nom (utile pour la sauvegarde)).
D'autre part il est désormais possible de déclarer:
#include <QtGui> au lieu des #include <QText...> <QPush...> etc, c'est plus court à écrire et on en oublie pas, mais c'est un peu plus long à la compilation.
0
Profil bloqué
23 févr. 2009 à 19:03
ok merci !
0
Certains ont adopté la maxime suivante:
Merci de marquer vos questions comme résolues quand elles l'­­ont été.
Ne pas oublier de l'appliquer!
0
Profil bloqué
23 févr. 2009 à 19:30
Désolé ... ;p
0