[Qt] Sauvergarder un fichier (mdi)

[Fermé]
Signaler
-
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
-
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...
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
143
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.
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 300
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.