[Qt] Sauvergarder un fichier (mdi)

Fermé
jean - 19 févr. 2010 à 14:50
Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 - 19 févr. 2010 à 15:39
Bonjour,

J'essaie d'enregistrer un fichier texte à partir d'une zone de texte QTextEdit, dans une sous fenêtre d'une MDI.
Je veux prendre la sous fenêtre active (car plusieurs onglets), et l'enregistrer dans un fichier. Seulement j'ai une erreur de segmentation que je n'arrive pas à résoudre sur cette ligne :

QTextEdit *zoneTexte = (QTextEdit*) fenetre -> widget() ;



Voici le code entier si sa peut vous aider:

(ne faites pas attention à creationFenetre(), il n'a pas grande importance, je vais le changer en un code beaucoup plus simple et optimisé)

merci;

**************************************** .CPP ***********

#include "FenPrincipale.h"

FenPrincipale::FenPrincipale()
{
// Création des menus
QMenu *menuFichier = menuBar()->addMenu("&Fichier");
QAction *actionNouveau = menuFichier->addAction("&Nouveau");
actionNouveau->setShortcut(QKeySequence("Ctrl+N"));
QAction *actionOuvrir = menuFichier->addAction("&Ouvrir");
actionOuvrir->setShortcut(QKeySequence("Ctrl+O"));
QAction *actionSauver = menuFichier->addAction("&Enregistrer");
actionSauver->setShortcut(QKeySequence("Ctrl+S"));
QAction *actionSauverSous = menuFichier->addAction("Enregistrer sous...");

QAction *actionImprimer = menuFichier->addAction("&Imprimer");
actionImprimer->setShortcut(QKeySequence("Ctrl+P"));
QAction *actionQuitter = menuFichier->addAction("&Quitter");
actionQuitter->setShortcut(QKeySequence("Ctrl+Q"));

QMenu *menuEdition = menuBar()->addMenu("&Edition");

QMenu *menuFormat = menuBar()->addMenu("&Format");
QAction *actionPolice = menuFormat->addAction("&Police");
QMenu *menuAffichage = menuBar()->addMenu("&Affichage");
QAction *actionBarre = menuAffichage->addAction(QString::fromUtf8("&Barre d'état"));



// Création de la zone centrale
zoneCentrale = new QMdiArea;
zoneCentrale->setViewMode(QMdiArea::TabbedView);

QMdiSubWindow *sousFenetre1;
QMdiSubWindow *sousFenetre2;
QMdiSubWindow *sousFenetre3;
QMdiSubWindow *sousFenetre4;


FenetreActive1=false;
FenetreActive2=false;
FenetreActive3=false;
FenetreActive4=false;
nbFenetre=1;
fenetreAjouter=0;
setCentralWidget(zoneCentrale);

connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));
connect(actionNouveau, SIGNAL(triggered()), this, SLOT(CreationFenetre()));
connect(actionOuvrir, SIGNAL(triggered()), this, SLOT(OuvrirFichier()));
connect(actionSauver, SIGNAL(triggered()), this, SLOT(Enregistrer()));






}


void FenPrincipale::CreationFenetre()
{

if (nbFenetre==4)
{
QMessageBox::critical(this, "Erreur", "Trop de fenêtre ouverte!");
}
while (nbFenetre<4 && fenetreAjouter==0)
{
if (FenetreActive1 == false && fenetreAjouter==0)
{
zoneTexte1 = new QTextEdit;
sousFenetre1= new QMdiSubWindow;
sousFenetre1 = zoneCentrale->addSubWindow(zoneTexte1);
nbFenetre++;
FenetreActive1=true;
fenetreAjouter=1;
sousFenetre1->show();
}
if (FenetreActive2 == false && fenetreAjouter==0)
{
zoneTexte2 = new QTextEdit;
sousFenetre2= new QMdiSubWindow;
sousFenetre2 = zoneCentrale->addSubWindow(zoneTexte2);
nbFenetre++;
FenetreActive2=true;
fenetreAjouter=1;
sousFenetre2->show();
}
if (FenetreActive3 == false && fenetreAjouter==0)
{
zoneTexte3 = new QTextEdit;
sousFenetre3= new QMdiSubWindow;
sousFenetre3 = zoneCentrale->addSubWindow(zoneTexte3);
nbFenetre++;
FenetreActive3=true;
fenetreAjouter=1;
sousFenetre3->show();
}
if (FenetreActive4 == false && fenetreAjouter==0)
{
zoneTexte4 = new QTextEdit;
sousFenetre4= new QMdiSubWindow;
sousFenetre4 = zoneCentrale->addSubWindow(zoneTexte4);
nbFenetre++;
FenetreActive4=true;
fenetreAjouter=1;
sousFenetre4->show();
}


}
fenetreAjouter=0;

}



void FenPrincipale::OuvrirFichier()
{

fileName=QFileDialog::getOpenFileName(this, tr("Ouvrir document texte"), "/", tr("Text files (*.txt)"));
QMessageBox::information(this, "Fichier", QString::fromUtf8("Vous avez sélectionné :\n") + fileName);
QFile fichier(fileName);
if(fichier.open(QIODevice::ReadOnly | QIODevice::Text))
{

zoneTexte5 = new QTextEdit;
sousFenetre5= new QMdiSubWindow;
sousFenetre5 = zoneCentrale->addSubWindow(zoneTexte5);
zoneTexte5->setPlainText(fichier.readAll());

}
else QMessageBox::critical(this, "Erreur", "Impossible d'ouvrir le fichier!");

}


void FenPrincipale::Enregistrer()
{


path = QFileDialog::getSaveFileName(this);
QFile fichier(path);
QMdiSubWindow *fenetre ;
fenetre = zoneCentrale -> activeSubWindow() ;
QTextEdit *zoneTexte = (QTextEdit*) fenetre -> widget() ;


if (fichier.open(QFile::WriteOnly))
{
QTextStream out(&fichier);
out << zoneTexte->toPlainText();
}


}




************************************** .h************************
#ifndef HEADER_FENPRINCIPALE
#define HEADER_FENPRINCIPALE

#include <QtGui>

class FenPrincipale : public QMainWindow
{
Q_OBJECT
public:
FenPrincipale();


public slots:
void CreationFenetre();
void OuvrirFichier();
void Enregistrer();

private:


QString path;
QString fileName;
QMdiArea *zoneCentrale;

QTextEdit *zoneTexte1;
QMdiSubWindow *sousFenetre1;
QTextEdit *zoneTexte2;
QMdiSubWindow *sousFenetre2;
QTextEdit *zoneTexte3;
QMdiSubWindow *sousFenetre3;
QTextEdit *zoneTexte4;
QMdiSubWindow *sousFenetre4;
QTextEdit *zoneTexte5;
QMdiSubWindow *sousFenetre5;
bool FenetreActive1,FenetreActive2,FenetreActive3,FenetreActive4;
int nbFenetre, fenetreAjouter;
};


#endif

3 réponses

Je viens de remarquer que la fonction activeSubWindow me retournais 0. Je vois pas pourquoi, elle devrai me retourner un pointeur sur ma fenêtre active normalement...
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
19 févr. 2010 à 15:34
elle devrai me retourner un pointeur sur ma fenêtre active normalement...
Elle devrait ... mais elle ne le fait pas -> donc elle a une bonne raison de ne pas le faire !
'activeSubWindow' retourne un pointeur sur la fenetre active ... mais il n'y a pas de fenêtre active. Qu'est-ce qu'un widget actif ? C'est celui qui a le focus. Et pourquoi n'y a-t-il pas de sous-fenêtre ayant le focus... simplement parcequ'il a été perdu avec l'appel à 'QFileDialog::getSaveFileName'.
Alors il y a deux solutions:
- soit faire appel à 'activeSubWindow' avant le 'getSaveFileName' (mais il subsiste un risque de ne pas avoir le focus),
- soit faire appel à 'currentSubWindow' après le 'getSaveFileName'.
Dans tous les cas il faut tester la validité du pointeur !
Bonne continuation.
0
Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 1 329
19 févr. 2010 à 15:39
Il faut tester la valeur de retour de activeSubWindows !
à l'avnir quand tu poste un code, surtout aussi gros, utilise les balise de code pour conserver l'indentation, car là c'est illisible.
0