Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] Problème éditeur de texte

Récurrent le problème pour mettre le texte en gras

Sujet résolu
    1 septembre 2008 à 22:00:51

    Bonjour,

    Voila, je suis débutant en C++ :-°
    (Notez la triple décoration hein :D )

    J'ai, suite au chapitre du cours de M@teo sur les différentes parties de la fenêtre, décidé de créer un petit éditeur de texte.
    Super, j'arrive à faire une fonction pour quitter, pour effacer le document en entier d'un coup de gomme, mettre le texte en italique et le souligner, MAIS, je n'arrive pas à mettre le texte en gras.

    Lorsque je clique sur le bouton "Gras", il s'enfonce comme les autres, mais le texte n'est pas mis en gras.

    Voici le code source :

    Code C++ : MaFenetre.cpp
    #include "MaFenetre.h"
    
    FenPrincipale::FenPrincipale()
    {
        QTextEdit *texte = new QTextEdit;
        setCentralWidget(texte);
    
        QFontComboBox *choixPolice = new QFontComboBox;
        choixPolice->setCurrentFont(QFont("Courier", 12));
    
        //Menu "Fichier"
            QMenu *menuFichier = menuBar()->addMenu("&Fichier");
                QAction *actionEffacer = menuFichier->addAction("&Effacer");
                    actionEffacer->setIcon(QIcon("effacer.png"));
                    actionEffacer->setStatusTip("Efface le texte en cours");
                QAction *actionQuitter = menuFichier->addAction("&Quitter");
                    actionQuitter->setIcon(QIcon("exit.png"));
                    actionQuitter->setStatusTip("Quitter le programme");
    
        //Menu "Edition"
            QMenu *menuEdition = menuBar()->addMenu("&Edition");
                QAction *actionGras = menuEdition->addAction("&Gras");
                    actionGras->setCheckable(true);
                    actionGras->setIcon(QIcon("gras.png"));
                    actionGras->setStatusTip("Afficher le texte en gras");
                    QFont gras;
                    gras.setBold(true);
                    actionGras->setFont(gras);
    
                QAction *actionItalique = menuEdition->addAction("&Italique");
                    actionItalique->setCheckable(true);
                    actionItalique->setIcon(QIcon("italique.png"));
                    actionItalique->setStatusTip("Afficher le texte en italique");
    
                QAction *actionSouligner = menuEdition->addAction("So&uligner");
                    actionSouligner->setCheckable(true);
                    actionSouligner->setIcon(QIcon("souligner.png"));
                    actionItalique->setStatusTip("Souligner le texte");
    
        //Menu "Affichage"
            QMenu *menuAffichage = menuBar()->addMenu("&Affichage");
    
        //Barre d'outils
            QToolBar *toolBarH = addToolBar("Texte");
                toolBarH->setMovable(false);
                toolBarH->setMaximumHeight(50);
                toolBarH->addAction(actionQuitter);
                toolBarH->addSeparator();
                toolBarH->addAction(actionEffacer);
                toolBarH->addSeparator();
                toolBarH->addAction(actionGras);
                toolBarH->addAction(actionSouligner);
                toolBarH->addAction(actionItalique);
                toolBarH->addSeparator();
                toolBarH->addWidget(choixPolice);
    
        //Barre d'état
            QStatusBar *barreEtat = statusBar();
            barreEtat->showMessage("Bienvenue dans l'éditeur", 2000);
    
    
    /*****************************************************************************************************************
                                                    Liste des actions
    *****************************************************************************************************************/
        //Action : "Quitter"
            connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));
            actionQuitter->setShortcut(QKeySequence("Ctrl+Q"));
    
        //Action : "Effacer"
            QObject::connect(actionEffacer, SIGNAL(triggered()), texte, SLOT(clear()));
            actionEffacer->setShortcut(QKeySequence("Ctrl+E"));
    
        //Action : "Gras"
          QObject::connect(actionGras, SIGNAL(triggered()), texte, SLOT(texteGras()));
           actionGras->setShortcut(QKeySequence("Ctrl+G"));
    
        //Action : "Italique"
            QObject::connect(actionItalique, SIGNAL(triggered(bool)), texte, SLOT(setFontItalic(bool)));
            actionItalique->setShortcut(QKeySequence("Ctrl+I"));
    
        //Action : "Souligné"
            QObject::connect(actionSouligner, SIGNAL(triggered(bool)), texte, SLOT(setFontUnderline(bool)));
            actionSouligner->setShortcut(QKeySequence("Ctrl+U"));
    
    }
    
    void FenPrincipale::texteGras()
    {
        texte->setFontWeight(actionGras->isChecked() ? QFont::Bold : QFont::Normal);
    }
    


    Je ne pense pas qu'il faille mettre le header ou le main, vu qu'il n'y a que les prototypes ou le minimum pour afficher notre fenêtre :euh:

    Bref, voila, à la compilation, je n'ai pas d'erreur, juste un avertissement avec un menu vide, c'est tout.

    Je répète que je débute, ça fait moins d'une semaine que je programme, mais j'ai fait tous les TP et suivi les instructions à la lettre. :ange:
    Mais là, vraiment, j'ai beau chercher dans tous les sens, je ne trouve pas. :'( D'habitude, lorsque j'ai un problème, au bout de quelques instants je trouve l'erreur et elle est presque corrigée desuite. Mais là ... :waw:

    Bref, merci d'avoir pris le temps de lire ce long topic, et de m'aider si vous y répondez (sinon Image utilisateur).
    • Partager sur Facebook
    • Partager sur Twitter
      1 septembre 2008 à 22:33:11

      Après SetShortcut, tu peux utiliser plutôt la fonction QObject::tr() (après je en sais pas si cela fait la même chose ;) ). Mais ce que tu peux faire c'est regarder si tu as bien connecté le signal, afficher une boîte de message dans la fonction que t'appelles (car c'est peut-être dans cette fonction qu'il y a un problème ;)
      • Partager sur Facebook
      • Partager sur Twitter
        1 septembre 2008 à 22:46:55

        Merci pour ta réponse.

        Je n'ai pas compris le QObject::tr(), et après avoir lu la doc, je ne comprends pas bien où le placer.

        Sinon, j'ai l'impression que le SLOT n'est pas appellé, puisque le simple appel d'un message d'information (l'équivalent d'un alert(); en javascript quoi) n'est pas exécuté.

        J'ai réussi à appeller le message en nommant le pointeur du slot "receveur" this, mais à ce moment-là, en exécutant le reste de la fonction (texte->setFontWeight... etc), le programme se plante (un message d'erreur blabla).

        Merci encore ^^
        • Partager sur Facebook
        • Partager sur Twitter
          1 septembre 2008 à 22:52:21

          Donc la fonction n'est pas appelé...
          Cela peut venir de n'importe où l'erreur. Par exemple, du fait que la fonction appelé ne se trouve pas des les public (protected, ou private ^^ ) slots
          • Partager sur Facebook
          • Partager sur Twitter
            1 septembre 2008 à 22:55:01

            Et bien, voici le header :
            public slots:
                    void texteGras();
            


            EDIT : Bon, je reprendrais demain à tête reposée, pare que là o_O
            • Partager sur Facebook
            • Partager sur Twitter
              1 septembre 2008 à 23:08:18

              Pfff j'ai trouvé d'où vien ton erreur :lol:
              C'est dans la connexion du signal ^^, le troisième paramètre doit être ta classe !!!!!
              • Partager sur Facebook
              • Partager sur Twitter
                1 septembre 2008 à 23:14:01

                Et mettant le nom de la classe, j'ai là une erreur de compilation :

                MaFenetre.cpp:76: error: expected primary-expression before ',' token


                La ligne 76 correspond à :
                QObject::connect(actionGras, SIGNAL(triggered()), FenPrincipale, SLOT(texteGras()));
                


                EDIT : Et dans le cours de M@teo, il y a :

                Citation : M@teo

                * Un pointeur vers l'objet qui émet le signal.
                * Le nom du signal que l'on souhaite "intercepter".
                * Un pointeur vers l'objet qui contient le slot récepteur.
                * Le nom du slot qui doit s'exécuter lorsque le signal se produit.



                Le pointeur ici, c'est this ou texte ? :euh:
                Je pense à texte puisqu'il est défini comme le principal widget.
                • Partager sur Facebook
                • Partager sur Twitter
                  1 septembre 2008 à 23:51:42

                  Je pense aussi que vu que la fonction texteGras() est membre de la classe FenPrincipale, il faut mettre this. Ca devrait résoude le problème.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 septembre 2008 à 23:54:36

                    Ce n'est pas parce que c'est le widget principale qu'il faut le mettre ^^
                    En fait, le troisième paramètre indique à quelle classe il faut aller pour avoir la fonction que tu choisis (celle dans le SLOT()). Même si ta classe ne dérive pas QObject cela marche quand-même :D
                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 septembre 2008 à 7:21:32

                      Non, en mettant le nom de la classe (FenPrincipale), j'ai la belle erreur de compilation dite plus haut.
                      Si je met this, c'est la fonction setFontWeight qui plante : un beau message d'erreur :'(

                      Je pense que je vais reprendre le code à 0 ^^
                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 septembre 2008 à 8:07:27

                        Ce qui serait pas mal, ce serait de faire dériver ta classe de quelque chose. Par exemple, comme ton nom de classe, c'est ta FenPrincipale, tu peux le faire dériver de QMainWindow, et tu n'auras plus l'obligation d'écrire à chaque fois QObject::connect mais connect tout simplement ;)

                        Et cela sera aussi plus logique pour le code ^^
                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 septembre 2008 à 8:44:25

                          Oui, ma classe FenPrincipale était déjà dérivée de QMainWindow, mais je ne sais pas pourquoi j'ai remis QObject::connect x_X

                          Merci du conseil quand même ^^
                          • Partager sur Facebook
                          • Partager sur Twitter
                            2 septembre 2008 à 9:18:46

                            Oui dans ce cas, c'est parce que il faut que tu mette this et non le nom de ta classe (vu que t'es dans ta classe en fait) ^^
                            PS : normalement c'est cela :lol:
                            • Partager sur Facebook
                            • Partager sur Twitter
                              2 septembre 2008 à 9:47:39

                              :/ Non, là, lorsque j'appelle la fonction texte->setFontWeight, ça retourne une erreur Windows :'(

                              Par contre, si je met un message d'information, ça l'affiche =) Donc, il y a peut être un espoir ? ^^
                              • Partager sur Facebook
                              • Partager sur Twitter
                                2 septembre 2008 à 9:57:11

                                Oui, cela veut dire qu'il y a une erreur dans la fonction texteGras(). il s'agit peut-être de la fonction ternaire.... Ce que tu peux faire c'est un truc du genre :
                                if(actionGras->IsChecked())
                                return texte->setFontWeight(QFont::Bold);
                                return texte->setFontWeight(QFont::Normal);
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  2 septembre 2008 à 15:12:11

                                  :'(

                                  Toujours pas :/

                                  Pourtant, voici des variantes au code que tu m'as proposé :
                                  FenPrincipale.cpp :
                                  void FenPrincipale::texteGras()
                                  {
                                      QMessageBox::information(this, "Debug", "Fonction <strong>texteGras()</strong> bien lancée.");
                                          return texte->setFontWeight(QFont::Bold);
                                  }
                                  

                                  Résultat : Le programme affiche le message et plante.


                                  FenPrincipale.cpp
                                  void FenPrincipale::texteGras()
                                  {
                                      QMessageBox::information(this, "Debug", "Fonction <strong>texteGras()</strong> bien lancée.");
                                      if(actionGras->isChecked())
                                      {
                                          QMessageBox::information(this, "Debug", "Condition <strong>checked()</strong> bien lancée.");
                                          return texte->setFontWeight(QFont::Bold);
                                      }
                                  }
                                  

                                  Résultat : Le programme affiche le premier message, mais plante (et n'affiche donc pas le second).

                                  J'en déduis qu'il ne reconnait pas que actionGras est un QAction*, alors que actionGras est notée dans le header.

                                  Merci de m'aider quand même ^^
                                  C'est sympa les membres qui aident :)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    2 septembre 2008 à 15:16:44

                                    Euh ta fonction est bel et bien appelé quand tu cliques sur l'action ?
                                    PS : Mais non, tes boites s'affichent. Je suis pas très en forme ^^ (ca doit être à cause de la rentrée :D )

                                    Edit : est-ce que tu pourrais rénvoyer le contneu de test fichiers, maintenant qu'ils ont été modifié (et aussi le header stp)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      2 septembre 2008 à 15:35:15

                                      Oui, bien sûr :
                                      FenPrincipale.cpp :
                                      #include "MaFenetre.h"
                                      
                                      FenPrincipale::FenPrincipale()
                                      {
                                          //Création du widget central.
                                          QTextEdit *texte = new QTextEdit;
                                          setCentralWidget(texte);
                                      
                                          //Définition de la géométrie de la fenêtre
                                          setFixedSize(450, 500);
                                      
                                          QFontComboBox *choixPolice = new QFontComboBox;
                                          choixPolice->setCurrentFont(QFont("Courier", 12));
                                      
                                          //Menu "Fichier"
                                              QMenu *menuFichier = menuBar()->addMenu("&Fichier");
                                                  //Action Effacer => à modifier
                                                  QAction *actionEffacer = menuFichier->addAction("&Effacer");
                                                      actionEffacer->setIcon(QIcon("effacer.png"));
                                                      actionEffacer->setStatusTip("Efface le texte en cours");
                                                  
                                                  //Action Quitter => à modifier
                                                  QAction *actionQuitter = menuFichier->addAction("&Quitter");
                                                      actionQuitter->setIcon(QIcon("exit.png"));
                                                      actionQuitter->setStatusTip("Quitter le programme");
                                      
                                          //Menu "Edition"
                                              QMenu *menuEdition = menuBar()->addMenu("&Edition");
                                                  //Action Gras
                                                  QAction *actionGras = menuEdition->addAction("&Gras");
                                                      actionGras->setCheckable(true);
                                                      actionGras->setIcon(QIcon("gras.png"));
                                                      actionGras->setStatusTip("Afficher le texte en gras");
                                      
                                                  //Action Italique
                                                  QAction *actionItalique = menuEdition->addAction("&Italique");
                                                      actionItalique->setCheckable(true);
                                                      actionItalique->setIcon(QIcon("italique.png"));
                                                      actionItalique->setStatusTip("Afficher le texte en italique");
                                      
                                                  //Action Souligner
                                                  QAction *actionSouligner = menuEdition->addAction("So&uligner");
                                                      actionSouligner->setCheckable(true);
                                                      actionSouligner->setIcon(QIcon("souligner.png"));
                                                      actionItalique->setStatusTip("Souligner le texte");
                                      
                                          //Menu "Affichage"
                                              QMenu *menuAffichage = menuBar()->addMenu("&Affichage");
                                      
                                          //Barre d'outils
                                              QToolBar *toolBarH = addToolBar("Texte");
                                                  toolBarH->setMovable(false);            //Non-déplacable
                                                  toolBarH->setMaximumHeight(50);         //50px de hauteur max
                                                  
                                                  toolBarH->addAction(actionQuitter);     //ACTION : Quitter
                                                  toolBarH->addSeparator();               //SEPARATEUR
                                                  toolBarH->addAction(actionEffacer);     //ACTION : Effacer
                                                  toolBarH->addSeparator();               //SEPARATEUR
                                                  toolBarH->addAction(actionGras);        //ACTION : Gras
                                                  toolBarH->addAction(actionSouligner);   //ACTION : Souligner
                                                  toolBarH->addAction(actionItalique);    //ACTION : italique
                                                  toolBarH->addSeparator();               //SEPARATEUR
                                                  toolBarH->addWidget(choixPolice);       //Widget : choix police
                                      
                                          //Barre d'état
                                              QStatusBar *barreEtat = statusBar();
                                              barreEtat->showMessage("Bienvenue dans l'éditeur", 2000);
                                      
                                      
                                      /*****************************************************************************************************************
                                                                                      Liste des actions
                                      *****************************************************************************************************************/
                                          //Action : "Quitter"
                                              connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));
                                              actionQuitter->setShortcut(QKeySequence("Ctrl+Q"));
                                      
                                          //Action : "Effacer"
                                              connect(actionEffacer, SIGNAL(triggered()), texte, SLOT(clear()));
                                              actionEffacer->setShortcut(QKeySequence("Ctrl+E"));
                                      
                                          //Action : "Gras"
                                             connect(actionGras, SIGNAL(triggered()), this, SLOT(texteGras()));
                                             actionGras->setShortcut(QKeySequence("Ctrl+G"));
                                      
                                          //Action : "Italique"
                                              connect(actionItalique, SIGNAL(triggered(bool)), texte, SLOT(setFontItalic(bool)));
                                              actionItalique->setShortcut(QKeySequence("Ctrl+I"));
                                      
                                          //Action : "Souligné"
                                              connect(actionSouligner, SIGNAL(triggered(bool)), texte, SLOT(setFontUnderline(bool)));
                                              actionSouligner->setShortcut(QKeySequence("Ctrl+U"));
                                      
                                      }
                                      
                                      void FenPrincipale::texteGras()
                                      {
                                          if(actionGras->isChecked())
                                              return texte->setFontWeight(QFont::Bold);
                                      
                                          return texte->setFontWeight(QFont::Normal);
                                      }
                                      



                                      Ensuite, le header :
                                      FenPrincipale.h
                                      #ifndef HEADER_FENPRINCIPALE
                                      #define HEADER_FENPRINCIPALE
                                      
                                      #include <QtGui>
                                      
                                      class FenPrincipale : public QMainWindow
                                      {
                                          Q_OBJECT
                                      
                                      	public:
                                      		FenPrincipale();
                                      
                                          public slots:
                                              void texteGras();
                                      
                                          private:
                                              QAction *actionGras;
                                              QTextEdit *texte;
                                              //Tous les autres objets que j'ai créé
                                              //Inutile de les copier dans le code pour surcharger 
                                      };
                                      
                                      
                                      #endif
                                      


                                      Merci encore ^^
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        2 septembre 2008 à 15:47:14

                                        Je ne sais pas si cela a un rapport mais tu fais QAction *actionGras = menuEdition->addAction("&Gras"); alors que tu devrais plutôt faire actionGras = menuEdition->addAction("&Gras");, puisque actionGras est déjà déclaré (pareil pour QTextEdit)

                                        Et qu'est-ce qu'ils disent dans le message ? Que l'application a rencontré un problème etc ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          2 septembre 2008 à 15:53:54

                                          Oh my god :waw:
                                          Je t'aime Image utilisateur

                                          C'était tellement simple et bête :'(

                                          Bref, il fallait simplement ne pas redéclarer les objets.

                                          Merci beaucoup mick009 ;)

                                          A +
                                          Tom

                                          PS totallement HS : Vivement que Underworld sorte, hein ? :D
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            2 septembre 2008 à 16:01:56

                                            C'est clair ^^
                                            Mais j'ose même pas imaginer le prix qu'ils vont demander :lol:
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              12 septembre 2008 à 13:35:04

                                              salut!je suis aussi débutante en C++.je dois faire aussi un petit editeur de texte.je voulais tester votre programme pour voire les fonctionnalités que tu as pu developper.est ce que je peux avoir le main() du programme pour pouvoir compiler?
                                              Merci d'avance.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                30 septembre 2008 à 21:13:22

                                                Bonjour, ce n' est pas mon programme mais le main doit être le même:
                                                /*main.cpp*/
                                                
                                                #include <QApplication>
                                                #include <QtGui>
                                                #include "FenPrincipale.h"
                                                
                                                int main(int argc, char *argv[])
                                                {
                                                    QApplication app(argc, argv);
                                                
                                                    QString locale = QLocale::system().name();
                                                    QTranslator translator;
                                                    translator.load(QString("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
                                                    app.installTranslator(&translator);
                                                
                                                    FenPrincipale fenetre;
                                                    fenetre.show();
                                                
                                                    return app.exec();
                                                }
                                                


                                                Voila... a+

                                                PS:Bravo pour l' organisation de ton code Tombest, je ne fais pas mieux!!
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                L'important n'est pas de savoir maîtriser une technologie à la perfection, mais d'avoir une belle capacité d'adaptation.

                                                [Qt] Problème éditeur de texte

                                                × 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