Partage
  • Partager sur Facebook
  • Partager sur Twitter

QCheckBox, Décocher quand j'en coche un autre

    31 mars 2021 à 10:42:58

    main.cpp

    #include <QApplication>
    #include <fenetreconfirmation.h>
    #include <fenetreinscription.h>
    #include <QtSql>
    #include <QSqlDatabase>
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    
        db.setHostName("192.168.1.183"); // @ip serveur MySQL
        db.setDatabaseName("chronotrail"); // Nom de la base
        db.setUserName("root"); // Nom utilisateur
        db.setPassword("1234"); // Mot de passe
    
    
        if(db.open()) {
            qDebug() << "Ok - ouverture de la base de donnée";
    
        }
    
        else {
        qDebug() << "Echec d'ouverture de la base de donnée";
        qDebug() << db.lastError();
        }
    
        FenetreInscription *fenetrePourInscription = new FenetreInscription;
        fenetrePourInscription->show();
    
        return app.exec();
    }
    

    fenetreinscription.cpp

    #include "fenetreinscription.h"
    #include "fenetrechoixcourse.h"
    
    void FenetreInscription::ouvrirChoixCourse()
    {
        FenetreInscription fenetre;
        FenetreChoixCourse *ChoixCourse = new FenetreChoixCourse;
    
        QSqlQuery query;
        query.prepare("INSERT INTO coureur(nom, prenom, date_naissance, sexe, mail, pre_inscrit, dossard) "
                      "VALUES (:nom, :prenom, :date_naissance, :sexe, :mail, :pre_inscrit, :dossard)");
        if(Homme->isChecked()){
            Femme->setCheckState(Qt::Unchecked);
            query.bindValue(3, "homme");
    
        }
        else if(Femme->isChecked()){
            Homme->setCheckState(Qt::Unchecked);
            query.bindValue(3, "femme");
        }
        query.bindValue(0, Nom->text());
        query.bindValue(1, Prenom->text());
        query.bindValue(2, DateDeNaissance->text());
        query.bindValue(4, Email->text());
        query.bindValue(5, "0");
        query.bindValue(6, Dossard->text());
    
        query.exec();
        qDebug() << query.lastError();
    
    
        ChoixCourse->show();
    }
    
    FenetreInscription::FenetreInscription(): QWidget()
    {
        setFixedSize(300, 240);
    
        Nom = new QLineEdit;
        Prenom = new QLineEdit;
        Email = new QLineEdit;
        Donnee = new QFormLayout;
        Homme = new QCheckBox;
        Femme = new QCheckBox;
        Dossard = new QLineEdit;
        DateDeNaissance = new QLineEdit;
    
        Donnee->addRow("Votre Nom", Nom);
        Donnee->addRow("Votre Prenom", Prenom);
        Donnee->addRow("Homme", Homme);
        Donnee->addRow("Femme", Femme);
        Donnee->addRow("Votre Email", Email);
        Donnee->addRow("Votre date de naissance \"aaaa/mm/jj\"", DateDeNaissance);
        Donnee->addRow("Numéro de dossard", Dossard);
    
        setLayout(Donnee);
    
        Enregistrer = new QPushButton("Enregistrer", this);
    
        Enregistrer->setToolTip("Permet d'enregistrer un nouveau client");
        Enregistrer->setCursor(Qt::PointingHandCursor);
        Enregistrer->move(30, 200);
        connect(Enregistrer, SIGNAL(clicked()),this,SLOT(ouvrirChoixCourse()));
        connect(Enregistrer, &QPushButton::released, Enregistrer, [this] () { this->close();});
    
        Annuler = new QPushButton("Annuler", this);
    
        Annuler->setToolTip("Annuler");
        Annuler->setCursor(Qt::PointingHandCursor);
        Annuler->move(170, 200);
    
        connect(Annuler, &QPushButton::clicked, Annuler, [this] () { this->close();});    
    
        connect(Femme,SIGNAL(stateChanged(int)),this,SLOT(verif(int)));
    
    }
    

    fenetreinscription.h

    #ifndef FENETREINSCRIPTION_H
    #define FENETREINSCRIPTION_H
    
    #include <QValidator>
    #include <QtWidgets/QApplication>
    #include <QWidget>
    #include <QtWidgets/QPushButton>
    #include <QtWidgets/QLineEdit>
    #include <QtWidgets/QFormLayout>
    #include <QCheckBox>
    #include <QSqlQuery>
    #include <QApplication>
    #include <sql.h>
    #include <QtSql>
    #include <QSqlDatabase>
    #include <QAbstractButton>
    
    class FenetreInscription : public QWidget
    {
        Q_OBJECT
    public:
        FenetreInscription();
    
    private:
        QLineEdit *Nom; 
        QLineEdit *Prenom;
        QLineEdit *Email;
        QLineEdit *DateDeNaissance;
        QCheckBox *Homme;
        QCheckBox *Femme;
        QLineEdit *Dossard;
        QPushButton *Enregistrer;
        QPushButton *Annuler;
    
        QFormLayout *Donnee;
    
    signals:
    
    public slots:
        void ouvrirChoixCourse();
    };
    
    #endif // FENETREINSCRIPTION_H
    

    Bonjour, j'ai un problème j'essaie de ne pouvoir choisir qu'un seul sexe pour ce faire j'essaie de décocher la case homme lorsque la case femme est coché et inversement dans l'autre cas mais je n'arrive pas a trouvé comment faire j'ai essayé qui ne fonctionne pas celle avec 

    else if(Femme->isChecked()){
            Homme->setCheckState(Qt::Unchecked);
            query.bindValue(3, "femme");
        }



    -
    Edité par MorinSimon 31 mars 2021 à 10:43:24

    • Partager sur Facebook
    • Partager sur Twitter
      31 mars 2021 à 15:28:14

      Salut, il faut que tu regardes du côté de la classe QButtonGroup et sa fonction setExclusive

      C'est un widget qui peut contenir plusieurs QCheckBox, si le groupe est exclusif alors il dès qu'on cochera un bouton il décochera tous les autre.

      C'est beaucoup plus simple que ce que tu as essayer de faire avec un signal et un slot mais si on voulait quand même le faire comme ça avec un signal et un slot il aurait fallu connecter aussi le signal stateChanged de Homme (tu l'as fait que sur femme) avec ton slot verif et plutôt utiliser la fonction 

      Homme->setChecked(false);

      Mais imagine dans une application où t'as pas deux QCheckBox mais 10, le slot verif deviendrait vite un beau bordel ... Le QButtonGroup est la solution facile, élégante et maintenable qui correspond à ce que tu veux faire

      • Partager sur Facebook
      • Partager sur Twitter
        1 avril 2021 à 10:27:13

        Je vois merci je vais essayé ça au plus vite et je vous tien au courant

        • Partager sur Facebook
        • Partager sur Twitter

        QCheckBox, Décocher quand j'en coche un autre

        × 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