[Qt] C++ Nouveau Document
Résolu
Profil bloqué
-
Profil bloqué -
Profil bloqué -
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 .
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 .
A voir également:
- [Qt] C++ Nouveau Document
- Comment reduire la taille d'un document - Guide
- Nouveau site coco chat - Accueil - Réseaux sociaux
- Comment créer un nouveau groupe sur whatsapp - Guide
- Créer un nouveau compte gmail - Guide
- Signer un document word - Guide
8 réponses
Pas de grosse modif à faire mais une difficulté à utiliser les pointeurs...
Une remarque préliminaire dans la fonction suivante:
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 ?
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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 !
Aidez moi !
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 !
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 !
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.
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.