[Qt] C++ Nouveau Document
Résolu/Fermé
A voir également:
- [Qt] C++ Nouveau Document
- Nouveau outlook - Accueil - Mail
- Nouveau site coco chat - Accueil - Réseaux sociaux
- Signer un document word - Guide
- Le document à télécharger comporte 19 pages. en numérotant automatiquement chaque page de ce document, on constate que sa numérotation ne commence pas à 1. quel nom d’animal apparaît sur la page avec le numéro 30 ? - Forum Bureautique
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.