Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt]Déselectionner des QRadioButton

rassemblées dans un QGroupBox

Sujet résolu
    7 mars 2008 à 0:33:16

    Bonsoir ! :)
    Voilà, j'ai suivi les tutos de M@teo sur Qt et j'ai essayé d'aller un peu plus loin avec la doc, pour voir ce que ça donnerait, mais voilà, tout allait bien jusqu'à ce que ça bloque pour de bon...

    J'ai une classe Fenetre dérivée de QWidget comme dans les tutos, qui a pour membres 9 QRadioButton et deux QPushButton pour valider le formulaire ou le remettre à zéro.
    Quatre de mes QRadioButton sont répartis deux par deux dans des QGroupBox, donc pour chaque couple, je ne peux sélectionner qu'un seul bouton (c'est bien ce que je veux), mais par contre, je ne peux plus tout déselectionner...
    C'est pour ça que j'ai créé le bouton de remise à zéro, que je connecte à un slot de ma fenetre qui s'occupe de ça en appelant pour chaque QRadioButton la méthode setChecked(false).
    Mais hélas, ça ne fonctionne pas non plus :(

    Je vous mets les codes minimaux pour que ce soit plus clair :) :

    Le main est tout simplement le même que dans les tutos.

    Fenetre.h


    1. #ifndef DEF_FENETRE
    2. #define DEF_FENETRE
    3. #include <QApplication>
    4. #include <QWidget>
    5. #include <QGroupBox>
    6. #include <QVBoxLayout>
    7. #include <QCheckBox>
    8. #include <QRadioButton>
    9. #include <QPushButton>
    10. #include <QMessageBox>
    11. class Fenetre : public QWidget
    12. {
    13.     Q_OBJECT
    14.     public:
    15.     Fenetre();
    16.     public slots:
    17.     void ajouter(bool);
    18.     void retrancher(bool);
    19.     void calculer();
    20.     void reset();
    21.     private:
    22.     int m_nbRisques;
    23.     QRadioButton *m_homme, *m_femme, *m_infarctus1, *m_infarctus2, *m_tabac, *m_hypertension, *m_diabete, *m_HDL, *m_HDL1;
    24.     QPushButton *m_valider, *m_reset;
    25. };
    26. #endif


    Fenetre.cpp


    1. #include "Fenetre.h"
    2. Fenetre::Fenetre() : QWidget()
    3. {
    4.     setFixedSize(700, 600);
    5.     QVBoxLayout *layoutFenetre = new QVBoxLayout(this);
    6.     QGroupBox *risque = new QGroupBox("Facteurs de risque", this);
    7.     QVBoxLayout *layoutRisque = new QVBoxLayout(risque);
    8.         QGroupBox *groupeAge = new QGroupBox("Age", risque);
    9.             QVBoxLayout *layoutAge = new QVBoxLayout(groupeAge);
    10.                 m_homme = new QRadioButton("Homme de 50 ans ou plus", groupeAge);
    11.                 m_femme = new QRadioButton("Femme de 60 ans ou plus", groupeAge);
    12.             layoutAge->addWidget(m_homme);
    13.             layoutAge->addWidget(m_femme);
    14.         groupeAge->setLayout(layoutAge);
    15.         QGroupBox *groupeAntecedants = new QGroupBox("Antécédents familiaux de maladie coronaire précoce", risque);
    16.             QVBoxLayout *layoutAntecedants = new QVBoxLayout(groupeAntecedants);
    17.                 m_infarctus1 = new QRadioButton("Infarctus du myocarde ou mort subite avant 55 ans chez le père ou chez un parent du 1er degré de sexe masculin", groupeAntecedants);
    18.                 m_infarctus2 = new QRadioButton("Infarctus du myocarde ou mort subite avant 65 ans chez la mère ou chez un parent du 1er degré de sexe féminin", groupeAntecedants);
    19.             layoutAntecedants->addWidget(m_infarctus1);
    20.             layoutAntecedants->addWidget(m_infarctus2);
    21.         groupeAntecedants->setLayout(layoutAntecedants);
    22.         QGroupBox *groupeTabagisme = new QGroupBox("Tabagisme", risque);
    23.             QVBoxLayout *layoutTabagisme = new QVBoxLayout(groupeTabagisme);
    24.                 m_tabac = new QRadioButton("Actuel, ou arrêté depuis moins de 3 ans", groupeTabagisme);
    25.             layoutTabagisme->addWidget(m_tabac);
    26.         groupeTabagisme->setLayout(layoutTabagisme);
    27.         QGroupBox *groupeHypertension = new QGroupBox("Hypertension artérielle permanente", risque);
    28.             QVBoxLayout *layoutHypertension = new QVBoxLayout(groupeHypertension);
    29.                 m_hypertension = new QRadioButton("Traitée ou non traitée*", groupeHypertension);
    30.             layoutHypertension->addWidget(m_hypertension);
    31.         groupeHypertension->setLayout(layoutHypertension);
    32.         QGroupBox *groupeDiabete = new QGroupBox("Diabète de type 2", risque);
    33.             QVBoxLayout *layoutDiabete = new QVBoxLayout(groupeDiabete);
    34.                 m_diabete = new QRadioButton("Traité ou non traité*", groupeDiabete);
    35.             layoutDiabete->addWidget(m_diabete);
    36.         groupeDiabete->setLayout(layoutDiabete);
    37.         QGroupBox *groupeHDL = new QGroupBox("HDL-Cholestérol", risque);
    38.             QVBoxLayout *layoutHDL = new QVBoxLayout(groupeHDL);
    39.                 m_HDL = new QRadioButton("< 0.40 g/L (1.0 mmol/L) quel que soit le sexe", groupeHDL);
    40.             layoutHDL->addWidget(m_HDL);
    41.         groupeHDL->setLayout(layoutHDL);
    42.     layoutRisque->addWidget(groupeAge);
    43.     layoutRisque->addWidget(groupeAntecedants);
    44.     layoutRisque->addWidget(groupeTabagisme);
    45.     layoutRisque->addWidget(groupeHypertension);
    46.     layoutRisque->addWidget(groupeDiabete);
    47.     layoutRisque->addWidget(groupeHDL);
    48.     risque->setLayout(layoutRisque);
    49.     QGroupBox *protecteur = new QGroupBox("Facteur protecteur", this);
    50.         QVBoxLayout *layoutProtecteur = new QVBoxLayout(protecteur);
    51.             QGroupBox *groupeHDL1 = new QGroupBox("HDL-cholestérol", protecteur);
    52.                 QVBoxLayout *layoutHDL1 = new QVBoxLayout(groupeHDL1);
    53.                     m_HDL1 = new QRadioButton(">= 0.60 g/L (1.5 mmol/L)", groupeHDL1);
    54.                 layoutHDL1->addWidget(m_HDL1);
    55.             groupeHDL1->setLayout(layoutHDL1);
    56.         layoutProtecteur->addWidget(groupeHDL1);
    57.     protecteur->setLayout(layoutProtecteur);
    58.     m_valider = new QPushButton("Calculer...", this);
    59.     m_reset = new QPushButton("Remettre à zér0", this);
    60.     layoutFenetre->addWidget(risque);
    61.     layoutFenetre->addWidget(protecteur);
    62.     layoutFenetre->addWidget(m_valider);
    63.     layoutFenetre->addWidget(m_reset);
    64.     m_nbRisques = 0;
    65.     QObject::connect(m_homme, SIGNAL(toggled(bool)), this, SLOT(ajouter(bool)));
    66.     QObject::connect(m_femme, SIGNAL(toggled(bool)), this, SLOT(ajouter(bool)));
    67.     QObject::connect(m_infarctus1, SIGNAL(toggled(bool)), this, SLOT(ajouter(bool)));
    68.     QObject::connect(m_infarctus2, SIGNAL(toggled(bool)), this, SLOT(ajouter(bool)));
    69.     QObject::connect(m_tabac, SIGNAL(toggled(bool)), this, SLOT(ajouter(bool)));
    70.     QObject::connect(m_hypertension, SIGNAL(toggled(bool)), this, SLOT(ajouter(bool)));
    71.     QObject::connect(m_diabete, SIGNAL(toggled(bool)), this, SLOT(ajouter(bool)));
    72.     QObject::connect(m_HDL, SIGNAL(toggled(bool)), this, SLOT(ajouter(bool)));
    73.     QObject::connect(m_HDL1, SIGNAL(toggled(bool)), this, SLOT(retrancher(bool)));
    74.     QObject::connect(m_valider, SIGNAL(clicked()), this, SLOT(calculer()));
    75.     QObject::connect(m_reset, SIGNAL(clicked()), this, SLOT(reset()));
    76. }
    77. void Fenetre::ajouter(bool ajouter)
    78. {
    79.     if(ajouter)
    80.         m_nbRisques++;
    81.     else
    82.         m_nbRisques--;
    83. }
    84. void Fenetre::retrancher(bool retrancher)
    85. {
    86.     if(retrancher)
    87.         m_nbRisques--;
    88.     else
    89.         m_nbRisques++;
    90. }
    91. void Fenetre::calculer()
    92. {
    93.     QString nbRisques;
    94.     nbRisques.setNum(m_nbRisques);
    95.     QString concentration="";
    96.     switch(m_nbRisques)
    97.     {
    98.         case 0:
    99.             concentration="&lt; 2.20 g/L";
    100.         case 1:
    101.             concentration="&lt; 1.90 g/L";
    102.             break;
    103.         case 2:
    104.             concentration="&lt; 1.60 g/L";
    105.             break;
    106.         default:
    107.             concentration="&lt; 1.30 g/L";
    108.     }
    109.     QMessageBox::information(this, "Résultat", "Le nombre de facteurs de risque est de "+nbRisques+",<br />ce qui correspond à une concentration de LDL-c "+concentration);
    110. }
    111. void Fenetre::reset()
    112. {
    113.     if(m_homme->isChecked())  m_homme->setChecked(false);
    114.     else    m_femme->setChecked(false);
    115.     if(m_infarctus1->isChecked())  m_infarctus1->setChecked(false);
    116.     else    m_infarctus2->setChecked(false);
    117.     m_tabac->setChecked(false);
    118.     m_hypertension->setChecked(false);
    119.     m_diabete->setChecked(false);
    120.     m_HDL->setChecked(false);
    121.     m_HDL1->setChecked(false);
    122.     m_nbRisques=0;
    123. }


    Bon, faites pas attention au texte, c'est un programme pour mon médecin ! :p

    Ne voulant pas rester sur cet échec et souhaitant tester autre chose avant d'appeler à l'aide, j'ai fait quelque chose de peut-être un peu compliqué pour le problème, mais c'est ce qui m'est venu à l'esprit...
    Je vous explique :

    J'ai créé une classe Session héritée de QWidget, elle aussi, et qui a un membre de type pointeur vers Fenetre. J'ai modifié le constructeur de Fenetre pour qu'il prenne en paramètre un pointeur sur le QObject qui le contient. Ainsi, j'ai essayé de connecter le signal clicked() de mon bouton reset à un slot reset de ma classe Session.
    En gros je fais ça dans Fenetre.cpp:
    1. Fenetre::Fenetre(QWidget *parent) : QWidget(parent)
    2. {
    3.    //définition de tous mes membres
    4.    QObject::connect(m_reset, SIGNAL(clicked()), parent, SLOT(reset()));
    5. }


    et ça dans Session.cpp:
    1. Session::Session() : QWidget()
    2. {
    3.     m_fenetre = new Fenetre(this);
    4. }
    5. void Session::reset()
    6. {
    7.    delete m_fenetre;
    8.    m_fenetre = new Fenetre(this);
    9.    show();
    10. }


    Mais voilà, malgré le show() (que j'ai rajouté par la suite), lorsque j'appuie sur mon bouton reset, tout le contenu de la fenêtre s'efface et rien ne réapparaît...


    Je ne pense pas que ma seconde solution soit très judicieuse ni la plus simple, et je n'ai pas trouvé dans la doc de méthode de GGroupBox qui permettrait de tout déselectionner ce qu'elle contient...
    Si vous pouviez m'aider à trouver une solution autre que celle de simplement rajouter des QRadioBox "vides" pour n'en sélectionner aucune qui compte, je vous remercie d'avance de le faire :D !!

    Et puis si vous pouviez m'expliquer pourquoi ma seconde méthode ne fonctionne pas, je veux bien aussi :) , parce qu'il y a quelque chose dans le fonctionnement de l'affichage de la fenêtre principale que je n'ai pas du comprendre...

    Sur ce, merci et à bientôt !! (et désolé pour la longueur :o ...)
    • Partager sur Facebook
    • Partager sur Twitter
      7 mars 2008 à 1:44:51

      un groupbox, par définition, a une valeur et a une "case" de cochée (quasi) obligatoirement.
      • Partager sur Facebook
      • Partager sur Twitter
        7 mars 2008 à 13:04:00

        Ah oui, merci, j'avais pas encore assez regardé... :euh:

        Je mets le sujet en résolu, mais s'il y a une manière pour déselectionner les QRadioButton, je suis toujours preneur, et si quelqu'un peut m'expliquer ce en quoi ma seconde façon de faire est mauvaise, je suis toujours preneur. :)

        Merci encore et à bientôt !!
        • Partager sur Facebook
        • Partager sur Twitter

        [Qt]Déselectionner des QRadioButton

        × 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