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 :

Plus de propriété checkable sur QPushButton

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut Plus de propriété checkable sur QPushButton
    Hello,

    Après avoir créé une sous-classe de QPushButton, la propriété 'setCheckable' ne fonctionne plus !


    .h de la sous-classe
    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
     
    #include <QPushButton>
    #include <QPainter>
     
    class PushButtonPlus : public QPushButton
     
    {
        Q_OBJECT
     
    public:
        PushButtonPlus(QWidget *parent = 0,QString tooltip="");
     
    public slots:
     
     
    private:
     
     
    protected:
     
    signals:
       void mousePressEvent ( QMouseEvent * event );
     
    };
    .cpp de la sous-classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "pushButtonPlus.h";
     
    PushButtonPlus::PushButtonPlus(QWidget *parent, QString tooltip)
    {
        this->setCursor(QCursor(Qt::PointingHandCursor));
        this->setToolTip(tooltip);
        this->setCheckable(true);
        this->setChecked(false);
     
    }
    Pourtant, l'instance du bouton ne fait pas de toggle sur la fenetre !
    Je n'y comprends rien ...


    A+

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 81
    Par défaut
    C'est bizarre, fais voir le code où tu utilises ce bouton

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut
    Hello,

    ici, le code de la fenetre qui utilise ce bouton (le *.cpp) :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
     
     
    #include "subWindowBase.h"
     
     
    SubWindowBase::SubWindowBase(QWidget *parent) :
                QWidget(parent)
    {
              //la fenetre est pas active, par defaut
              setActive(false);
     
              glwidget = new GLWidget(this); // la fenetre ogl au milieu
              // tous les GrouBox au sein de la fenetre auront ce style
              this->setStyleSheet("QGroupBox { border: 2px solid rgb(189, 189, 189); border-radius: 10px }");
     
     
              gridLayout = new QGridLayout(this);
                    gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
                    tools_spec_left = new QGroupBox(this);
                    tools_spec_left->setObjectName(QString::fromUtf8("tools_spec_left"));
                    tools_spec_left->setMinimumSize(QSize(65, 0));
     
                    verticalLayout_2 = new QVBoxLayout(tools_spec_left);
                    verticalLayout_2->setObjectName(QString::fromUtf8("verticalLayout_2"));
                    pushButton_3 = new QPushButton(tools_spec_left);
                    pushButton_3->setObjectName(QString::fromUtf8("pushButton_3"));
     
                    verticalLayout_2->addWidget(pushButton_3);
     
                    verticalSpacer_2 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
     
                    verticalLayout_2->addItem(verticalSpacer_2);
     
                    pushButton_16 = new QPushButton(tools_spec_left);
                    pushButton_16->setObjectName(QString::fromUtf8("pushButton_16"));
     
                    verticalLayout_2->addWidget(pushButton_16);
     
     
                    gridLayout->addWidget(tools_spec_left, 0, 0, 2, 1);
     
     
     
                    gridLayout->addWidget(glwidget, 0, 1, 1, 1);
     
                    tools_spec_low = new QGroupBox(this);
                    tools_spec_low->setObjectName(QString::fromUtf8("tools_spec_low"));
                    tools_spec_low->setMinimumSize(QSize(0, 65));
                    tools_spec_low->setMaximumSize(QSize(16777215, 65));
                    tools_spec_low->setBaseSize(QSize(0, 0));
     
                    horizontalLayout = new QHBoxLayout(tools_spec_low);
                    horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
                    pushButton_13 = new QPushButton(tools_spec_low);
                    pushButton_13->setObjectName(QString::fromUtf8("pushButton_13"));
     
                    horizontalLayout->addWidget(pushButton_13);
     
                    horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
     
                    horizontalLayout->addItem(horizontalSpacer);
     
                    pushButton_12 = new QPushButton(tools_spec_low);
                    pushButton_12->setObjectName(QString::fromUtf8("pushButton_12"));
     
                    horizontalLayout->addWidget(pushButton_12);
     
     
                    gridLayout->addWidget(tools_spec_low, 1, 1, 1, 1);
     
                    tools_common = new QGroupBox(this);
                    tools_common->setObjectName(QString::fromUtf8("tools_common"));
                    tools_common->setMinimumSize(QSize(65, 0));
                    tools_common->setToolTip(tr("outils communs (à toutes les fenetres"));
     
                    verticalLayout = new QVBoxLayout(tools_common);
                    verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
     
     
                    toggleBigSmall=new QPushButton();
                    toggleBigSmall->setToolTip(tr("agrandir cette fenetre"));
                    toggleBigSmall->setIcon(QIcon("://images_generales/split_no"));
                    //toggleBigSmall->setIconSize(QSize(20,20));
                    toggleBigSmall->setCursor(QCursor(Qt::PointingHandCursor));
                    verticalLayout->addWidget(toggleBigSmall);
    //*************************************************************
    //****************************I C I !***************************
    //*************************************************************
     
                    toggleGrid=new PushButtonPlus(this,tr("afficher la grille"));
                    toggleGrid->setIcon(QIcon("://images_generales/grid"));
                    verticalLayout->addWidget(toggleGrid);
     
    //*************************************************************
    //*************************************************************
    //*************************************************************
     
                pushButton_4->setObjectName(QString::fromUtf8("pushButton_4"));
               pushButton_5->setObjectName(QString::fromUtf8("pushButton_5"));
     
     
     
                    verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
     
                    verticalLayout->addItem(verticalSpacer);               pushButton_11->setObjectName(QString::fromUtf8("pushButton_11"));
                    pushButton_10->setObjectName(QString::fromUtf8("pushButton_10"));
                   pushButton_9->setObjectName(QString::fromUtf8("pushButton_9"));
                pushButton_8->setObjectName(QString::fromUtf8("pushButton_8"));
     
     
     
                    gridLayout->addWidget(tools_common, 0, 2, 2, 1);
     
                    QShortcut *shortcut = new QShortcut(QKeySequence(tr("Ctrl+G", "File|Open")),this);
                    connect(shortcut, SIGNAL(activated(QMouseEvent *)), this->glwidget, SLOT(gridOnOff(QMouseEvent *)));
     
                    connect(toggleBigSmall, SIGNAL(clicked()),this->parentWidget(), SLOT(toggleBigSmall()));
     
                    //connect(toggleGrid, SIGNAL(clicked()),this->glwidget, SLOT(gridOnOff()));
                    connect(toggleGrid, SIGNAL(mousePressEvent ( QMouseEvent * )),this->glwidget, SLOT(gridOnOff(QMouseEvent *)));
     
    }
     
    //pour acceder au ToolTip du bouton toggle
     
    void SubWindowBase::setToolTip(QString theString){
        this->toggleBigSmall->setToolTip(theString);
    }
     
     
    //pour acceder a l'image du bouton toggle
     
    void SubWindowBase::setIcon(QIcon icon){
     
        toggleBigSmall->setIcon(icon);
        toggleBigSmall->setIconSize(QSize(32,32));
    }
     
    // on desactive la sous-fentre lors de la sortie
     
    void SubWindowBase::leaveEvent ( QEvent * event ){
     
        //this->setEnabled(false);
        setActive(false);
     
    }
     
    // on active la sous-fentre lors de la sortie
     
    void SubWindowBase::enterEvent ( QEvent * event ){
     
        //this->setEnabled(true);
        setActive(true);
     
    }
     
    bool SubWindowBase::isActive(){
        return active;
    }
     
    void SubWindowBase::setActive(bool state){
        active=state;
    }
    A+

    ... ici le *.h...

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
     
    #ifndef SUBWINDOWBASE_H
    #define SUBWINDOWBASE_H
     
    #include <QWidget>
    #include <QPushButton>
    #include <QGroupBox>
    #include <QScrollBar>
    #include "../glwidget.h"
    #include "./boutons/pushButtonPlus.h"
     
    #include <QtGui>
    #include <QtGui/QFrame>
     
    class SubWindowBase : public QWidget
    {
        Q_OBJECT
     
    public:
        SubWindowBase(QWidget *parent = 0);
     
        // ces methodes afin des pouvoir modifier le bouton 'ToggleBigSmall' au sein
        // des la classe parente.
     
        void setToolTip(QString);
        void setIcon(QIcon);
     
        bool isActive();
        void setActive(bool state);
     
    public slots :
            // pour indiquer le pressage du bouton 'ToggleBigSmall'
            //void toogleView();
     
    protected:
        //void keyPressEvent(QKeyEvent *event);
        void leaveEvent ( QEvent * event );
        void enterEvent ( QEvent * event );
        void mouseEvent(QMouseEvent *mEv);
     
    signals:
      void clicked();
      //void toggleAsked(SubWindowBase*);
     
     
    private:
         GLWidget *glwidget;
         QGridLayout *gridLayout;
         QGroupBox *tools_spec_left;
         QVBoxLayout *verticalLayout_2;
         QPushButton *pushButton_3;
         QSpacerItem *verticalSpacer_2;
         QPushButton *pushButton_16;
         QGraphicsView *graphicsView;
         QGroupBox *tools_spec_low;
         QHBoxLayout *horizontalLayout;
         QPushButton *pushButton_13;
         QSpacerItem *horizontalSpacer;
         QPushButton *pushButton_12;
         QGroupBox *tools_common;
         QVBoxLayout *verticalLayout;
         QPushButton *toggleBigSmall;
         //************************************
         //************ I C I *****************
         //************************************
     
         PushButtonPlus *toggleGrid;
     
         //************************************
         //************************************
         //************************************
         QPushButton *pushButton_5;
         QSpacerItem *verticalSpacer;
         QPushButton *pushButton_11;
         QPushButton *pushButton_10;
         QPushButton *pushButton_9;
         QPushButton *pushButton_8;
         QMenuBar *menubar;
         QStatusBar *statusbar;
         bool active;
     
    };
    //! [0]
     
    #endif // SUBWINDOWBASE_H
    A+

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 81
    Par défaut
    Plutôt que d'essayer de trouver le problème dans un grand programme, essaye de l'isolé dans un petit exemple. moi je l'ai essayé et ça marche
    MyPushButton.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <QPushButton>
     
    class MyPushButton : public QPushButton
    {
        Q_OBJECT
    public:
        explicit MyPushButton(QWidget *parent = 0, QString tooltip ="");
     
    signals:
     
    public slots:
     
    };
    MyPushButton.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "mypushbutton.h"
     
    MyPushButton::MyPushButton(QWidget *parent, QString tooltip) :
        QPushButton(parent)
    {
        this->setToolTip(tooltip);
        this->setCheckable(true);
    }
    mainwindow.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <QtGui/QMainWindow>
    #include "mypushbutton.h"
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT    
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    private:
        MyPushButton *myBtn;
    mainwindow.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "mainwindow.h"
     
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        myBtn = new MyPushButton(this,"this is my btn");
    }

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Ça n'aiderait pas d'appeler le constructeur de QPushButton ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut Yes !
    J'ai suivi votre conseil (à savoir faire des essais sur qqch de simple) et j'ai trouvé !

    C'est en fait le signal maison que je déclare :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    protected:
     
    signals:
        void mousePressedEvent ( QMouseEvent * event );

    sans ce signal, le 'setCheckable' fonctionne'.

    Je pense que le signal est redéfini et il faut donc réimplémenter la routine de check/uncheck, via un slot appelé par ce signal :

    this.setChecked(this.isChecked?false:true);

    C'était tordu cette histoire, pour un débutant !

    Merci.

    A+

    Gilles

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Le signal mousePressedEvent n'existe pas, de toute façon vu le nom tu te doutes bien que ce n'est pas un signal mais une méthode liée à un événement (après il suffit de lire la doc). La différence c'est que mousePressedEvent est en gros un "slot" d'événement système (clic de souris).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.setChecked(this.isChecked?false:true); // faux
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setChecked(!isChecked()); // mieux
    J'ai mal compris ton explication mais je ne vais pas te laisser comme ça alors que j'ai l'impression que tu as "résolu" le problème n'importe comment. Y'a absolument rien à réimplémenter (le code ci-dessus ne sert à rien donc) ! L'erreur était qu'effectivement tu redéfinissais mousePressEvent, méthode appelée au clic de souris et qui en interne dans l'implémentation Qt gère le check.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut Héritage de QPushButton.
    Hello Troudhyl,

    Effectivement, setChecked(!isChecked()) est beaucoup plus élégant!

    -> Je vais adopter cette façon de faire dès mon prochain 'toogle'.

    En fait, le but principal du sous-classement de QPushButton est de gérer le
    clic droit sur le bouton.


    ...Donc, je n'ai trouvé que cette solution-là (à savoir, créer un signal mousePressed).

    Je suis preneur si tu as une solution qui ne nécessite PAS de réimplémentation...

    Merci pour ton aide.

    A+

    Gilles

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Alors le clic droit c'est une nouveauté, tu n'en as pas parlé avant. Encore une fois, capter les événements système se fait dans les fonctions (virtuelles protégées) mises à disposition par Qt, à réimplémenter. Y'a quelques signaux (clicked, pressed, toggled...) déjà présents par commodité pour gérer les événements clic gauche, mais pour le clic droit il te faut réimplémenter mousePressEvent (et là si tu veux tu peux émettre un signal à toi, mais il faut lui choisir un nom plus précis que "mousePressed").

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void MyPushButton::mousePressEvent(QMouseEvent* e)
    {
        QPushButton::mousePressEvent(e); // on appelle le traitement par défaut de la classe mère
     
        if (e->button() == Qt::RightButton)
        {
            emit rightPressed(); // signal
            // ou alors directement le code de ce qui est provoqué
        }
    }

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut Cela fonctionne et c'est propre !
    Hello Troudhyl,

    Tout fonctionne maintenant et c'est beaucoup plus propre.

    Un grand merci, tu m'as appris beaucoup.

    A+

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 22/08/2006, 00h33
  2. Réponses: 9
    Dernier message: 15/07/2006, 12h18
  3. Pourquoi n'y a-t-il plus de "délestage" massif sur le forum ?
    Par Eusebius dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 7
    Dernier message: 25/05/2006, 23h16
  4. équivalent de la propriété unselectable sur Mozilla
    Par jibouze dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 31/01/2006, 14h35
  5. [firebird][Linux][php]plus de 10 bases sur un serveur
    Par rahan15 dans le forum Installation
    Réponses: 5
    Dernier message: 04/10/2005, 10h33

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