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 :

QTabWidget et QRadioButton

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut QTabWidget et QRadioButton
    Bonjour,

    A travers les fichiers joints, je vous fais part d'un petit soucis d'actualisation de radioButtons insérés sur 2 onglets d'un tabWidget.

    L'application (simplifiée dans ce cas) affiche dans une comboBox le nom du radioButton checké par l'utlisateur - et ça marche très bien : en étant sur l'onglet n°1 chaque modification utilisateur du radioButton se répercute dans la comboBox, et en passant à l'onglet n°2, idem.

    C'est ici que ça commence à coincer : si l'utilisateur revient à l'onglet n°1, seuls les radioButtons de l'onglet 2 pourront encore être affichés dans la comboBox... impossible de récupérer ceux de l'onglet 1 !!

    J'ai bien essayé de réinitialiser à chaque fois tous les radioButtons, rien à faire... 2 radioButtons sont sélectionnés simultanément (1 dans chaque onglet) et c'est le dernier qui prime.

    D'où ce SOS à un éventuel truc ou astuce pour contourner ce comportement (désagréable)

    Bonne fin de week-end à tout le monde
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Avatar de mitkl
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 364
    Par défaut
    C'est normal, le problème vient de cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* Récupération du nom du radioButton checké */
    void MainWindow::SelectionNomRadioButton(void)
    {
        foreach(QRadioButton *radioButton, listRadioButtons)
            if (radioButton->isChecked())
                nomRadioButton = radioButton->text();
    }
    Pour te montrer le problème, j'ai rajouté des std::cout à chaque appel de cette fonction membre, et quand on coche dans le premier onglet, qu'on coche dans le deuxième et qu'on revient au premier, voici ce que ça donne :

    RadioButton1 checked
    RadioButton2
    RadioButton3
    RadioButton4
    RadioButton5
    RadioButton6
    RadioButton7 checked
    RadioButton8
    RadioButton9
    RadioButton10
    Le fait que le RadioButton1 soit coché est bien détecté MAIS puisque la boucle ne s'arrête pas, elle continue et va aussi détecter que RadioButton7 est coché. Donc la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nomRadioButton = radioButton->text();
    Va s'appliquer une première fois pour RadioButton1 mais va après s'appliquer sur RadioButton7 ! C'est pour cette raison que "RadioButton1" ne pourra plus s'afficher dans le Combobox.

    On pourrait réparer ça en plaçant un break à notre boucle comme ça non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /* Récupération du nom du radioButton checké */
    void MainWindow::SelectionNomRadioButton(void)
    {
        foreach(QRadioButton *radioButton, listRadioButtons)
            if (radioButton->isChecked())
            {
                nomRadioButton = radioButton->text();
                break;
            }
    }
    Non, car ça masquerait les boutons du deuxième onglet puisqu'on s'arrêterait au premier RadioButton coché, tu saisis le problème ?

    En réalité, il faut que dans ton algorithme, tu arrives à distinguer dans quel onglet tu es (tu peux le récupérer en faisant ui->tabWidget->currentIndex() et que tu traites en fonction de ça, et là il y a énormément de possibilité d'implémentation.

  3. #3
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut
    En réalité, il faut que dans ton algorithme, tu arrives à distinguer dans quel onglet tu es (tu peux le récupérer en faisant ui->tabWidget->currentIndex() et que tu traites en fonction de ça, et là il y a énormément de possibilité d'implémentation.
    Merci pour le test, cela a été très éclairant

    J'ai changé la QList en QVector, pour pouvoir indicer les boutons et ma fonction est devenue, en tenant compte de l'onglet courant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void MainWindow::SelectionNomRadioButton(void)
    {
        if (ui->tabWidget->currentIndex() == 0)
            for(int i = 0 ; i < 6; ++i){
                if (listRadioButtons[i]->isChecked())
                    nomRadioButton = listRadioButtons[i]->text();
            }
        else if (ui->tabWidget->currentIndex() == 1)
            for(int i = 6 ; i < listeRadioButtons.size(); ++i){
                if (listRadioButtons[i]->isChecked())
                    nomRadioButton = listRadioButtons[i]->text();
            }
    }
    C'est bien sûr un peu moins élégant, mais ça marche !

    Encore un grand merci et bonne soiréé

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dasycarpum Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void MainWindow::SelectionNomRadioButton(void)
    {
        if (ui->tabWidget->currentIndex() == 0)
            for(int i = 0 ; i < 6; ++i){
                if (listRadioButtons[i]->isChecked())
                    nomRadioButton = listRadioButtons[i]->text();
            }
        else if (ui->tabWidget->currentIndex() == 1)
            for(int i = 6 ; i < listeRadioButtons.size(); ++i){
                if (listRadioButtons[i]->isChecked())
                    nomRadioButton = listRadioButtons[i]->text();
            }
    }
    C'est bien sûr un peu moins élégant, mais ça marche !
    Salut
    Si tu te souviens des équations de droite (3°) tu peux faire plus élégant...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void MainWindow::SelectionNomRadioButton(void)
    {
        int dep=ui->tabWidget->currentIndex() * 6;
        int fin=(6 - listeRadioButtons.size()) * ui->tabWidget->currentIndex() + 6;
        for(int i = dep; i < fin; ++i){
            if (listRadioButtons[i]->isChecked())
                nomRadioButton = listRadioButtons[i]->text();
        }
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Salut
    Si tu te souviens des équations de droite (3°) tu peux faire plus élégant...
    La 3e c'est effectivement un peu loin pour que je me souvienne de quoi que ce soit !

    Mais j'admets que ta solution est plus sympa

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

Discussions similaires

  1. récupérer valeur QRadioButton
    Par magicbisous-nours dans le forum Débuter
    Réponses: 10
    Dernier message: 05/12/2008, 16h48
  2. Remplissage des page d'un QTabWidget
    Par Mic75 dans le forum Qt
    Réponses: 4
    Dernier message: 25/09/2008, 12h15
  3. Récupérer la valeur d'un QRadioButton
    Par magicbisous-nours dans le forum Débuter
    Réponses: 4
    Dernier message: 11/07/2008, 11h00
  4. Ajouter un onglet dans QTabWidget
    Par Invité dans le forum Qt
    Réponses: 6
    Dernier message: 26/02/2008, 15h46

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