IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Polymorphisme et événement sur un QCheckBox

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Points : 137
    Points
    137
    Par défaut Polymorphisme et événement sur un QCheckBox
    Bonjour,

    J'essaie depuis quelques jours de créer ma class myCheckBox dévrivée de QCheckBox.
    J'aimerai que cette nouvelle classe utilise le Signal stateChanged(int state)

    Voici le code que j'ai implémentée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #include "myCheckBox.h"
    #include <QApplication>
     
    myCheckBox::myCheckBox(QWidget * parent, int ID)
    	: QCheckBox(parent)
    {
        index=ID;
    	setMouseTracking(true);
    }
     
    void myCheckBox::enterEvent ( QEvent * event ) {  
     
    //qDebug()<<"la souris vient d'entrer dans ma zone";  
        QApplication::beep();
    	emit beginHighlightCurve(text());
    }  
     
    void myCheckBox::leaveEvent ( QEvent * event ) {
        QApplication::beep();
        emit stopHighlightCurve(text());
    }
     
    void myCheckBox::stateChanged(int state){
    Qt::CheckState  CBox = checkState();
    bool on = CBox == Qt::Checked;
    emit CheckChange( on);
    QApplication::beep();
    }
    Quand je mets la souris sur une instance of myCheckBox ca beep, quand j'enlève la souris ca beep mais quand coche ou décoche myCheckBox ca ne beep pas.
    seriez vous ce qu'il manque pour détecter un changement d'etat de myCheckBox ?

    Merci d'avance.
    Dereck

  2. #2
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Comment est déclaré myCheckBox::stateChanged ?
    Je pense que tu as mal compris le concept de signal/slot. Un signal n'a pas de corps de fonction, seul un slot en a un. Et il faut connecter le signal à un slot (ou une lambda à partir de C++11) pour que du code soit exécuté.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Points : 137
    Points
    137
    Par défaut
    Merci ymoreau pour ta réponse

    Voici la déclaration de la classe myCheckBox:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    #ifndef MYCHECKBOX_H_
    #define MYCHECKBOX_H_
     
    #include <QWidget>
    #include <QCheckBox>
    #include <QMessageBox>
    #include <qwt_plot_tradingcurve.h>
     
    class myCheckBox : public QCheckBox
    {
    	Q_OBJECT
     
    	public:
            myCheckBox(QWidget * parent, int ID);
            //SetCurve(QwtPlotItem *Curve_=NULL);
            int index;
            //QwtPlotItem *Curve_I;
    	private:
    		void msgBox(const QString msg);
     
    	protected:  
            virtual void enterEvent ( QEvent * event );
            virtual void leaveEvent ( QEvent * event );
            virtual void stateChanged(int state);
     
    	signals:
    		void beginHighlightCurve(QString name);
    		void stopHighlightCurve(QString name);
                    void CheckChange(bool on);
    };
     
    #endif /*MYCHECKBOX_H_*/
    En gros J'ai fait un graphique avec qwt qui contient plusieurs courbes.
    Pour chaque courbe je crée une instance de myCheckBox que je stock dans un vector.
    J'aimerai que la classe myCheckBox puisse émettre un signal CheckChange(bool on) que je connecterais a un slot de la classe graphique pour afficher ou enlever le graphe. Actuellement ca ne fonctionne pas.
    myCheckBox::stateChanged(int state) ne beep pas, donc n'est pas appeler quand je coche ou decoche le CheckBox. Donc je pense que j'émets jamais le signal CheckChange(bool on).
    S'il te plait serais tu comment je puis avoir une fonction qui soit appelé quand je coche ou decoche le CheckBox pour que je puisse définir le emit du CheckChange(bool on) signal ?

  4. #4
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Je pense que tu t'es embrouillé entre signal et fonction virtuelle, le concept est très différent.
    [signal] void QCheckBox::stateChanged(int state) n'est pas une fonction mais un signal, donc tu ne peux pas surcharger la fonction (elle n'existe pas), dans ton code tu crées donc une fonction et qui n'est pas connue des évènements internes de Qt. Si tu utilises le C++11 ou plus, le mot clé override permet de détecter ces erreurs à la compilation.

    En bref, tu dois créer un slot et le connecter à ce signal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Dans ton .h
    private slots:
        void doSomethingWhenStageChange(int state);
     
    // Dans ton constructeur
    connect(this, &myCheckBox::stateChanged, this, &myCheckBox::doSomethingWhenStageChange); // Si tu es encore en Qt4 tu dois utiliser la syntaxe avec les macros
    Là ton slot doSomethingWhenStageChange sera appelé à chaque fois que la QCheckBox émet le signal stateChanged, tu as juste à mettre le code de ton beep (ou n'importe quoi d'autre) dans le corps de la fonction doSomethingWhenStageChange.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void myCheckBox::doSomethingWhenStageChange(int state)
    {
        bool on = state == Qt::Checked;
        emit CheckChange(on);
     
        QApplication::beep();
    }

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Points : 137
    Points
    137
    Par défaut
    J'ai testé et effectivement maintenant ca marche !!

    GRAND MERCI !!

  6. #6
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 109
    Points
    6 109
    Par défaut
    Juste pour pinailler : un signal Qt est bien une fonction, mais c'est le moc (Meta-Object Compiler) de Qt qui en génère automatiquement l'implémentation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Swing]gérer un événement sur un JTextField
    Par madina dans le forum Composants
    Réponses: 3
    Dernier message: 22/11/2005, 11h56
  2. événement sur INSERT, DELETE, UPDATE
    Par papouAlain dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/12/2004, 15h40
  3. Quel évènement sur le redimensionnement ?
    Par Yoh dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 01/07/2004, 13h05
  4. [Débutant][jsp] évènement sur une liste
    Par phoebe dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 14/05/2004, 10h53
  5. Problèmes d'évènements sur ComboBox
    Par bakaneko dans le forum MFC
    Réponses: 3
    Dernier message: 23/02/2004, 08h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo