Partage
  • Partager sur Facebook
  • Partager sur Twitter

Entre les slots etles signaux je me perd un peu

En rapport avec le Tuto by M@teo...

Sujet résolu
    22 mai 2008 à 16:29:53

    Salut,

    Comme dans le titre, je suis en plein dans les signaux et slot.

    Comme suggéré en exercice j'essaie de connecter un bouton pour remettre a 0 QProgressBar : J'y suis arrivé. La barre de progression revient a 0. Mais QSlider non.

    -Est-til possible de réinitialiser QSlider?
    -Si oui dans quelle classe je peut trouver le slot pour réinitialiser QSlider (si c'est bien par un slot que l'on vas le réinitialiser)?
    -Sinon quelle méthode pour une telle prouesse!!

    Merci et bonne après-midi a tous!
    • Partager sur Facebook
    • Partager sur Twitter
      22 mai 2008 à 16:49:17

      Le slot void setValue(int); peut-être ?

      http://doc.trolltech.com/4.4/

      Tu le trouveras dans la classe QAbstractSlider qui est la classe parente de QSlider. ;)
      • Partager sur Facebook
      • Partager sur Twitter
        22 mai 2008 à 16:58:50

        J'ai déjà essayé ça.
        J'ai tenté d'écumer la doc un peu avant de poster et j'ai essayé d'autre slot qui me semblait possible, mais je me souvient plus trop de leurs nom...

        Sinon le code de MaFenetre.cpp :

        #include "Mafentre.h"
        
        MaFenetre::MaFenetre() : QWidget()
        {
            setFixedSize(300, 100);
        
            m_ProgressBar = new QProgressBar(this);
            m_ProgressBar->setGeometry(10, 20, 150, 20);
        
            m_slider = new QSlider(Qt::Horizontal, this);
            m_slider->setRange(0, 100);
            m_slider->setGeometry(10, 60, 150, 20);
        
            m_quitter = new QPushButton("Quitter",this);
            m_quitter->move(200, 20);
        
            m_reset = new QPushButton("RAZ !!", this);
            m_reset->move(200, 60);
        
            QObject::connect(m_slider, SIGNAL(valueChanged(int)), m_ProgressBar, SLOT(setValue(int))); //==> connection entre le slider et QProgressBar ==> fonctionne.
            QObject::connect(m_reset, SIGNAL(clicked()), m_ProgressBar, SLOT(reset())); //Remise à 0 de QProgressBar après l'apuis du bouton "RAZ !!" (m_reset) ==> fonctionne.
            QObject::connect(m_reset, SIGNAL(cliked()), m_slider, SLOT( setValue(int))); //C'est lui qui fait de la résistance!
            QObject::connect(m_quitter, SIGNAL(clicked()),qApp ,SLOT(quit())); //Quand on clique sur quitter et bien heu... on quitte  ==> Et fonctuionne.
        
        
        }
        


        A noté une faute de frappe dans le nom du .h (Mafentre.h) mais bien prise en compte dans le nom des fichiers etc... Mon programme compile et ce lance.
        • Partager sur Facebook
        • Partager sur Twitter
          22 mai 2008 à 17:03:37

          Attention les paramètres des slots doivent correspondrent. Tu peux te faire un slot personnalisé (genre reset() ), que tu appelle au signal clicked() et qui remet ton slider à zero (et par la même occasion ta progress bar, comme ça tu peux supprimer une connexion).
          • Partager sur Facebook
          • Partager sur Twitter
            22 mai 2008 à 17:10:43

            Bien vu pour le coup des paramètre des slot, je n'avait pas fait attention.
            Je vais tenter le slot personnalisé. Je tien au courant ;)

            ÉDIT: Bon je ne parvient pas à créer mon slot :)

            Mon code dans mon header :

            [...]    
                public slots:
                void ResetQpbQs ();
            [...]
            


            Mon code Dans MaFenetre.cpp

            void MaFenetre::ResetQpbQs()
            {
                    setTickPosition (0);
                    setvalue(0);
            }
            


            Le compilateur me renvoi:

            Citation : Le Compilateur

            [...] error: `setTickPosition' was not declared in this scope.



            Je ne suis pas sur que la méthode employer est bien celle que j'ai mis, mais comme le compilo me dit qu'il ne connait pas cette méthode j'aimerai d'abord régler ce problème.
            • Partager sur Facebook
            • Partager sur Twitter
              23 mai 2008 à 11:40:05

              Donne le code complet peut-être. Vérifie en particulier dans le .h si tu as bien mis la macro Q_OBJECT
              • Partager sur Facebook
              • Partager sur Twitter

              If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                23 mai 2008 à 14:21:19

                Oki,

                alors voici le code complet:

                Le header:
                #ifndef DEF_MAFENETRE
                #define DEF_MAFENETRE
                
                #include <QApplication>
                #include <QWidget>
                #include <QPushButton>
                #include <QLCDNumber>
                #include <QSlider>
                #include <QProgressBar>
                
                class MaFenetre : public QWidget{
                
                    Q_OBJECT
                
                    public:
                    MaFenetre();
                
                    public slots:
                    void ResetQpbQs ();
                
                    private:
                    QProgressBar *m_ProgressBar;
                    QSlider *m_slider;
                    QPushButton *m_quitter;
                    QPushButton *m_reset;
                };
                
                #endif
                


                L'implémentation:
                #include <QApplication>
                #include <QWidget>
                #include <QPushButton>
                #include <QLCDNumber>
                #include <QSlider>
                #include <QAbstractSlider>
                #include <QProgressBar>
                #include "Mafentre.h"
                
                
                MaFenetre::MaFenetre() : QWidget(){
                
                    setFixedSize(300, 100);
                
                    m_ProgressBar = new QProgressBar(this);
                    m_ProgressBar->setGeometry(10, 20, 150, 20);
                
                    m_slider = new QSlider(Qt::Horizontal, this);
                    m_slider->setRange(0, 100);
                    m_slider->setGeometry(10, 60, 150, 20);
                
                    m_quitter = new QPushButton("Quitter",this);
                    m_quitter->move(200, 20);
                
                    m_reset = new QPushButton("RAZ !!", this);
                    m_reset->move(200, 60);
                
                    QObject::connect(m_slider, SIGNAL(valueChanged(int)), m_ProgressBar, SLOT(setValue(int)));
                    QObject::connect(m_reset, SIGNAL(clicked()), this, SLOT(ResetQpbQs()));
                    //QObject::connect(m_reset, SIGNAL(clicked()), m_ProgressBar, SLOT(reset()));
                    //QObject::connect(m_reset, SIGNAL(cliked()), m_slider, SLOT( setValue(int)));
                    QObject::connect(m_quitter, SIGNAL(clicked()),qApp ,SLOT(quit()));
                
                
                }
                
                void MaFenetre::ResetQpbQs () {
                
                        setMinimum(0);
                        setValue(0);
                }
                


                Voila j'espère que se sera suffisant...
                • Partager sur Facebook
                • Partager sur Twitter
                  23 mai 2008 à 16:11:49

                  Je vois ton erreur.

                  void MaFenetre::ResetQpbQs () {
                          setMinimum(0);
                          setValue(0);
                  }
                  


                  setMinimum et setValue sont des méthodes du QSlider ou de la QProgressBar. Or là vu comment tu les appelles, c'est les méthodes de ta fenêtre (qui hérite de QWidget) que tu appelles ! Or QWidget n'a pas de méthode setMinimum... donc ça plante.

                  Il faut faire :

                  m_slider->setValue(0);
                  


                  Et voilà :)
                  Ca appellera la méthode setValue du slider, au lieu d'appeler celle de la fenêtre.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                    23 mai 2008 à 16:41:59

                    Re j'ai un peu tardé a répondre car le problème de départ n'est pas résolut.

                    Suite à ta correction, ça compile, mais ça n'a aucun effet quand je clique sur "RAZ !!".

                    Je pense que je n'emploie pas les bonnes méthode (car c'est bien des méthode qu'il faut utiliser et non les slots?), et bon bas il parait qu'elle est bien faite ? :-° il n'en reste pas moins qu'elle est énorme et je m'y perd un peu beaucoup... :o

                    Merci pour ton aide.

                    EDIT: I am a pure Boulet!! :-°
                    J'avait oublié de décommenter Q_OBJECT, alors forcement... Je le ferai plus c'est promis :euh:
                    J'ai changé aussi les méthodes : j'en ai trouver une qui marche pour le QSlider (il s'agit de setSliderPosition(0)) et setValue(in) pour QProgressBar.

                    Bref sa compile et sa marche comme je veux...
                    Mais bas oui mais... Je suis parvenu à configurer Code::Bocks pour compiler avec Qt et sa marchais, jusqu'as se que j'ai eu a compiler avec Q_OBJECT ou j'ai droit à :

                    Citation : Compilateur Code::Blocks

                    undefined reference to `vtable for MaFenetre'


                    Donc avec qmake -project puis qmake et make je peux compiler et lancer le programme. ma question:

                    Est-il possible de configurer Code::Blocks ou pas pour régler se problème?

                    En tout cas problème n° 1 résolut et merci au SDZ!!
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 mai 2008 à 19:15:29

                      Franchement, dans l'absolu c'est peut-être possible mais c'est trop compliqué. J'ai essayé en vain jusqu'ici. Je te recommande de compiler avec la console dès que tu utilises la macro Q_OBJECT car il est obligatoire d'appeler qmake avant.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                        23 mai 2008 à 19:39:02

                        Bon ba tan pis...
                        On utilisera la console et qmake...

                        Bon sur se merci et encor et bonne fin de soirée je reviendrai poser des question :D !!!

                        P.S. je kiff se site!!!

                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 juin 2008 à 15:19:20

                          Bonjour

                          Désolé de revenir si tard sur le sujet mais en cherchant à comprendre la même erreur, je suis arrivé rapidement sur ce post. J'imagine que ça pourra donc servir à quelqu'un d'autre.
                          Dans le cas où on utilise des slots personnalisés et donc la macro Q_OBJECT, il faut en effet passer par le moc (comme c'est si bien expliqué dans le tuto de c++). Si, à travers un terminal, cela ne pose pas de problème, Code::Bocks renvoie une erreur "undefined reference to `vtable for (nomdufichier)'".
                          pour résoudre ce problème, il suffit d'ajouter dans le projet (an faisant un Add Files) le fichier moc_(nomdufichier).cpp qui se trouve dans le même répertoire que le header et son implémentation.

                          Voila. En espérant que ca serve à quelqu'un
                          Bonne journée
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Entre les slots etles signaux je me perd un peu

                          × 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