Partage
  • Partager sur Facebook
  • Partager sur Twitter

Des widgets qui ne s'affichent pas

Dans une QMdiSubWindow

Anonyme
    31 août 2008 à 20:49:12

    Bonjour à tous,
    Me revoilà toujours avec le même prgramme qui me pose tant de soucis. Pour faire bref, c'et un petit programme en MDI qui permet de réaliser des fiches de révisions (c'est le même principe que le bloc-note que M@teo propose de faire en exercice sauf qu'ici le fenêtres ne sont pas que composées d'un QTextEdit).

    Au début tout marchait bien, puis j'ai eu quelques petits problèmes pour ce qui concere l'enregistrement(problèmes résols grâce au sdz ^^ ). Une fois ces problèmes résolus, je me suis aperçu qu'aucun widget ne s'affiche dans les fenêtre! :(

    Voici le code que je met en secret pour que ça ne prenne pas trop de place:

    fiche.h


    #ifndef DEF_FICHE
    #define DEF_FICHE
    
    #include <QtGui>
    
    class fiche : public QMdiSubWindow
    {
         public:
         fiche();
         QString lireContenu();
    
         private:
         QLineEdit *matiere;
         QLineEdit *sujet;
         QTextEdit *contenu;
    };
    
    #endif
    

    fiche.cpp


    #include "fiche.h"
    
    fiche::fiche()
    {
          //les en-têtes
          matiere = new QLineEdit;
          sujet = new QLineEdit;
          
          QFormLayout *layoutTete = new QFormLayout;
          layoutTete->addRow(tr("&Matière:"),matiere);
          layoutTete->addRow(tr("&Sujet:"),sujet);
          
          QGroupBox *groupeTete = new QGroupBox(tr("En-tête","Le début de la fiche"));
          groupeTete->setLayout(layoutTete);
            
          
          //le contenu
          contenu = new QTextEdit;
          
          
          //le layout principal
          QVBoxLayout *layoutPrincipal = new QVBoxLayout;
          layoutPrincipal->addWidget(groupeTete);
          layoutPrincipal->addWidget(contenu);
          
          setLayout(layoutPrincipal);     
    }
    
    QString fiche::lireContenu()
    {
       return contenu->toPlainText();
    }
    

    FenPrincipale.h


    #ifndef DEF_FENPRINCIPALE
    #define DEF_FENPRINCIPALE
    
    #include <QtGui>
    #include "fiche.h"
    
    class FenPrincipale : public QMainWindow
    {
         Q_OBJECT
          
         public:
            FenPrincipale();
         
         private slots:
            void nouveau();
            void enregistrer();
            void onglets();
         
         private:
            QMdiArea *zoneCentrale;
            QAction *actionNouveau;
            QAction *actionEnregistrer;
            QAction *actionQuitter;
            QAction *actionAffichageOnglets;
         
    };
    
    #endif
    

    FenPrincipale.cpp


    #include "FenPrincipale.h"
    
    FenPrincipale::FenPrincipale()
    {
        //la zone centrale
        zoneCentrale = new QMdiArea;
        setCentralWidget(zoneCentrale);
        
        
        //les actions
        actionNouveau = new QAction(tr("&Nouvelle fiche"),this);
        actionNouveau->setIcon(QIcon("images/nouveau.gif"));
        actionNouveau->setShortcut(QKeySequence("CTRL+N"));
        
        actionEnregistrer = new QAction(tr("&Enregistrer"),this);
        actionEnregistrer->setShortcut(QKeySequence("CTRL+S"));
        
        actionQuitter = new QAction(tr("&Quitter"),this);
        actionQuitter->setIcon(QIcon("images/quitter.gif"));
        
        actionAffichageOnglets = new QAction(tr("Afficher par onglets"),this);
        actionAffichageOnglets->setCheckable(true);
        
        
        //les menus
        QMenu *menuFichier = menuBar()->addMenu(tr("&Fichier"));
        menuFichier->addAction(actionNouveau);
        menuFichier->addAction(actionEnregistrer);
        menuFichier->addAction(actionQuitter);
        
        QMenu *menuAffichage = menuBar()->addMenu(tr("&Affichage"));
        menuAffichage->addAction(actionAffichageOnglets);
        
        
        
        //les connections
        connect(actionNouveau, SIGNAL(triggered()), this, SLOT(nouveau()));
        connect(actionEnregistrer, SIGNAL(triggered()), this, SLOT(enregistrer()));
        connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));
        connect(actionAffichageOnglets, SIGNAL(triggered()), this, SLOT(onglets()));
    }
    
    
    void FenPrincipale::nouveau()
    {
         fiche *ficheRevision = new fiche;
         ficheRevision->setWindowTitle(tr("nouvelle fiche"));
    
         zoneCentrale->addSubWindow(ficheRevision)->show();   
    }
    
    void FenPrincipale::enregistrer()
    {
       QString titre = QFileDialog::getSaveFileName(this,tr("enregistrer"),"",tr("fichier texte *.txt"));
                               
       QFile fichier(titre);
       
       fichier.open(QIODevice::ReadWrite);
       
       fiche *ficheRevision = static_cast< fiche* > (zoneCentrale->activeSubWindow());
       
       QString contenu = ficheRevision->lireContenu();
       fichier.write(contenu.toAscii());
       fichier.close();
    
    }
    
    void FenPrincipale::onglets()
    {
        zoneCentrale->setViewMode(QMdiArea::TabbedView); 
    }
    


    Pour que la ligne 60 de FenPrincipale.cpp fopnctionne, j'ai dû faire hériter la classe fiche de QMdiSubWindow. Lorsque j'ai cherché d'où le problème venait, j'ai enlevé le slot enregistrer et j'ai fait hériter fiche de QWidget et là: les widget de la fiche sont apparus! Pourtant il me semble que QMdiSubWindow hérite de QWidget, non? :o

    J'ai donc essayé de faire un héritage multiple avec ce que nous montre M@teo dans le chapitre sur QtDesigner et avec une petite recherche mais le code ne compile pas :(

    Je remercie d'avance ceux qui ont pris le temps de lire ce post.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      31 août 2008 à 22:26:01

      Il est simple:
      #include <QApplication>
      #include "fiche.h"
      #include "FenPrincipale.h"
      
      int main(int argc, char* argv[])
      {
          QApplication app(argc, argv);
      
          FenPrincipale fenetre;
          fenetre.show();
      
          return app.exec();
      }
      
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        3 septembre 2008 à 13:45:20

        Le problème vient-ti bien de l'héritage ou d'ailleur?
        • Partager sur Facebook
        • Partager sur Twitter
          3 septembre 2008 à 13:49:10

          Tu pourrais donner les warning du compilateur avec leurs lignes
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            12 septembre 2008 à 15:59:50

            Désolé pour le temps à répondre mais je n'ai pas pu me connecter, mar manque de temps à cause de la rentrée.

            Donc, quand j'essai de faire un héritage multiple:

            fiche.h


            #ifndef DEF_FICHE
            #define DEF_FICHE
            
            #include <QtGui>
            
            class fiche : public QMdiSubWindow, public QWidget
            {
                 public:
                 fiche();
                 QString lireContenu();
            
                 private:
                 QLineEdit *matiere;
                 QLineEdit *sujet;
                 QTextEdit *contenu;
            };
            
            #endif
            


            et le compilo me dit:
            fiche.h:7: warning: diredt base 'QWidget' inaccessible in 'fiche' due to ambiguity
            FenPrincipale.cpp: In member function 'void FenPrincipale::nouveau()':
            FenPrincipale.cpp:47: error: request for member 'setWindowsTitle' is ambigous
            FenPrincipale.cpp:49: error: 'QWidget' is an ambigous base of 'fiche'
            • Partager sur Facebook
            • Partager sur Twitter
              12 septembre 2008 à 16:37:51

              C'est simple: t inherites de QMdiSubWindow, qui inherite lui même de QWidget, que tu hérites aussi. Arrête d'hériter QWidget, et ca marcheras.
              Il te dit que cest "ambiguous", car pour lui il y a deux classes differentes QWidget.
              Williamson
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                12 septembre 2008 à 17:55:28

                Citation : Thasius

                C'est simple: t inherites de QMdiSubWindow, qui inherite lui même de QWidget, que tu hérites aussi. Arrête d'hériter QWidget, et ca marcheras.
                Il te dit que cest "ambiguous", car pour lui il y a deux classes differentes QWidget.
                Williamson


                Au début, je faisais un simple héritage de QMdiSubWindow mais comme je le dis dans le premier message, les widgets de la fiche ne s'affichent pas.
                • Partager sur Facebook
                • Partager sur Twitter
                  12 septembre 2008 à 18:03:21

                  En tout cas, ajouter une héritage de QWidget ne taideras pas, car ca sert à rien.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    12 septembre 2008 à 18:11:42

                    Oui, c'est la question que je me suis posée. Mais j'ai quand même essayé au cas où et après être parti d'un constat simple:Lorsque j'ai cherché d'où le problème venait, j'ai enlevé le slot enregistrer et j'ai fait hériter fiche de QWidget et là: les widget de la fiche sont apparus!

                    Donc, le problème ne viendrait pas de l'héritage... mais d'où alors?

                    Merci de t'intéresser à mon problème.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 septembre 2008 à 22:08:36

                      Peut tu m'envoyer un lien pour télécharger ton code par MP? Je le regarderais sous codeblocks et te renverais une version qui marche si je trouve.
                      Williamson
                      PS: Je suis pas dispo ce weekend à partir de demain à 11h.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        15 septembre 2008 à 17:56:07

                        J'ai mis tout le code dans mon premier post, ça ne suffit pas? o_O
                        Comment fait-on pour mettre un fichier en ligne? (quelqu'un aurait une bonne adresse svp)
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          17 septembre 2008 à 11:43:55

                          Dans le slot void nouveau(); j'ai essayé de mettre un QTextEdit à la place d'une fiche, et le QTextEdit s'affiche parfaitement. Le problème viendrait donc de la classe fiche mais je ne vois toujours pas où :( Qulqu'un aurait une idée?
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            25 septembre 2008 à 13:11:27

                            Vraiment personne pour m'aider?
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              26 septembre 2008 à 16:32:58

                              S'il vous plait, j'aimerai bien régler ce problème qui traîne depuis longtemps
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                29 septembre 2008 à 17:51:38

                                Sinon est-ce que quelqu'un pourrait m'expliquer comment mettre un objet perso dans une MdiSubWindow, svp?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  1 octobre 2008 à 21:08:51

                                  Citation : edouard22

                                  je sais pas :-°

                                  Merci de ton aide
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Des widgets qui ne s'affichent pas

                                  × 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