Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème mystérieux avec les QMdiSubWindow

    4 juin 2008 à 11:30:05

    Après le dernier chapitre de Mateo, je me suis tranquillement lancé dans un éditeur de texte MDI. Rien de bien méchant avec tout ce que fournis Qt :) Mais voila depuis le départ j'ai un problème mystérieux, lorsque j'ouvre un fichier via QFileDialog tout marche il m'ouvre un nouvel onglet mais lorsque je demande de créer un nouveau fichier, soit cas n°1: je demande via QFileDialog la destination du nouveau fichier (dans ce cas tout marche), cas n°2 : je crée un nouvel onglet avec un QTextEdit (dans ce cas il me crée un onglet vide sans QTextEdit). J'ai le même problème quand j'ouvre plusieurs fichiers en même temps via QFileDialog, il y a un QTextEdit pour le premier et le dernier alors que tous les autres onglets sont grisés. J'essaie des alternatives mais là je suis bloqué et je ne vois pas trop comment remédier à cet étrange problème :(

    Merci de votre aide ;)

    Mon code :
    void NoteProg::nouveau()
    {
        if(onglets.last()->getFenetre()->windowTitle() != "Sans Titre")
        {
            QString nomFichier = QFileDialog::getSaveFileName(this, "Nouveau", QDir::currentPath());
            onglets.append(new Onglet(new QTextEdit, aireCentrale));
            onglets.last()->setPath(nomFichier);
            onglets.last()->setTitre(nomFichier.remove(0, nomFichier.lastIndexOf('/')+1));
        }
    }
    
    void NoteProg::ouvrir()
    {
        QList<QString> nomFichiers = QFileDialog::getOpenFileNames(this, "Ouvrir", QDir::currentPath());
    
        for(int i = 0; i < nomFichiers.size(); i++)
        {
            if(onglets.last()->getFenetre()->windowTitle() != "Sans Titre")
            {
                cout << "Nouveau : " << nomFichiers[i].toStdString() << endl;
                onglets.append(new Onglet(new QTextEdit, aireCentrale));
            }
    
            onglets.last()->setPath(nomFichiers[i]);
    
            if (!onglets.last()->getFichier()->open(QIODevice::ReadOnly | QIODevice::Text))
            {
                onglets.last()->setPath(QString());
                QMessageBox::information(this, "NoteProg", QString("Impossible de lire %1.").arg(nomFichiers[i]));
                return;
            }
            else
            {
                QTextStream lectureStream(onglets.last()->getFichier());
                QString tempString;
                while(!lectureStream.atEnd())
                    tempString += lectureStream.readLine() + '\n';
                onglets.last()->getFichier()->close();
    
                onglets.last()->setTexte(tempString);
                onglets.last()->setTitre(nomFichiers[i].remove(0, nomFichiers[i].lastIndexOf('/')+1));
            }
        }
    }
    


    Classe Onglet (Créée pour un soucis de clarté dans la classe principale du programme):

    Onglet.h
    #ifndef DEF_ONGLET
    #define DEF_ONGLET
    
    #include <QMdiArea>
    #include <QMdiSubWindow>
    #include <QTextEdit>
    #include <QString>
    #include <QFile>
    #include <iostream>
    
    class Onglet
    {
        public:
        Onglet(QTextEdit *texteU, QMdiArea *aireU);
        ~Onglet();
    
        void setTexte(QString texteU);
        void setTitre(QString titreU);
        void setPath(QString pathU);
    
        private:
        QTextEdit *texte;
        QMdiSubWindow *fenetre;
        QString path;
        QFile *fichier;
    };
    
    #endif
    


    Onglet.cpp
    #include "Onglet.h"
    
    using namespace std;
    
    Onglet::Onglet(QTextEdit *texteU, QMdiArea *aireU)
    {
        texte = texteU;
        fenetre = aireU->addSubWindow(texte);
        setTitre("Sans Titre");
        setTexte(QString());
        path = QString();
        fichier = new QFile(path);
    }
    
    Onglet::~Onglet()
    {
        delete texte;
        delete fenetre;
        fichier->close();
        delete fichier;
    }
    
    void Onglet::setTexte(QString texteU)
    {
        texte->setText(texteU);
    }
    
    void Onglet::setTitre(QString titreU)
    {
        fenetre->setWindowTitle(titreU);
    }
    
    void Onglet::setPath(QString pathU)
    {
        path = pathU;
        fichier->setFileName(path);
    }
    
    • Partager sur Facebook
    • Partager sur Twitter

    Problème mystérieux avec les QMdiSubWindow

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown