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

Qt Discussion :

[QComboBox] Obtenir l'index courant


Sujet :

Qt

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Points : 16
    Points
    16
    Par défaut [QComboBox] Obtenir l'index courant
    Bonjour,

    Je suis sous QtCreator 5.4.1, avec windows 7, j'essaye de mettre au point un programme simple qui permet a un utilisateur de classer une image parmi un choix de classes présentes dans une liste de type QComboBox.
    Mon problème est que je n'arrive pas à trouver un moyen de retourner la valeur sélectionnée par l'utilisateur après qu'il ait effectué son choix : la fonction currentIndex me retourne toujours 0 avant même que l'utilisateur ait le temps de faire quoi que ce soit. En effectuant des recherches, j'ai pu constater que beaucoup de personnes déconseillent l'utilisation d'une fonction wait() pour attendre que l'utilisateur sélectionne un choix. Du coup je ne vois pas comment faire. J'ai également essayé de faire en sorte que la liste soit dans un objet héritant de QDialog afin que je puisse utiliser l'option setModal(true), mais ça n'a rien changé.

    Voici mon main et ma classe FenetreChoix


    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
     
     
    FenetreChoix::FenetreChoix(string chemin, vector<string> nom_defauts) : QDialog()
    {
        setModal(true);
     
        setFixedSize(300, 150);
     
        layout = new QVBoxLayout;
     
        layout->setAlignment(Qt::AlignHCenter);
     
        QLabel *image = new QLabel(this);
        image->setPixmap(QPixmap(QString::fromStdString(chemin)));
        layout->addWidget(image);
     
        QLabel *texte = new QLabel("A quelle classe appartient l image?");
     
        layout->addWidget(texte);
     
        liste = new QComboBox(this);
     
        for(unsigned int i =0 ; i< nom_defauts.size() ; i++){
     
            liste->addItem(QString::fromStdString(nom_defauts[i]));
     
        }
     
        layout->addWidget(liste);
     
        QPushButton* confirmer = new QPushButton("Confirmer  ?",this);
     
        QObject::connect(confirmer, SIGNAL(clicked()), qApp, SLOT(quit()));
     
        layout->addWidget(confirmer);
     
        setLayout(layout);
     
        choix = liste->currentIndex();
     
        show();
     
     
    }



    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
     
     
     
    int main(int argc, char *argv[])
    {
     
        QApplication app(argc, argv);
     
        FenetreInitiale fenetre;
     
        vector< pair<string,string> > ens_appr = fenetre.base_apprentissage_classe();
     
        string chemin_appr_non_classe = fenetre.base_apprentissage_non_classe();
     
        string chemin_test = fenetre.base_test();
     
        for(unsigned int i = 0; i < ens_appr.size() ; i++ ){
     
            cout<<"Classe : "<< ens_appr[i].first <<endl;
            cout<<"Repertoire : "<< ens_appr[i].second <<endl;
            cout<<endl;
     
        }
     
        cout<<"Chemin appr non classe : "<< chemin_appr_non_classe <<endl;
     
        //fenetre.show();
     
        vector<const char*> chemin_apprentissage;
     
        vector<string> nom_defauts;
     
        for(unsigned int i = 0 ; i < ens_appr.size() ; i++){
     
            nom_defauts.push_back(ens_appr[i].first);
     
        }
     
        for(unsigned int i = 0 ; i < ens_appr.size() ; i++){
     
            chemin_apprentissage.push_back(ens_appr[i].second.c_str());
     
        }
     
     
        FenetreChoix fenetre_liste("C:\\data\\test_apprentissage_supervisee\\appr_comet1\\comet000001.bmp",nom_defauts);
     
        cout<<"Classe selectionnee : "<< fenetre_liste.get_choix() <<endl;
     
    return app.exec();
     
     
     
     
     
    }




    Je n'ai pas mis le contenu de ma classe FenetreInitiale qui n'a pas de lien avec ce problème.

    Merci pour votre aide.

  2. #2
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 695
    Points : 2 434
    Points
    2 434
    Par défaut
    Bonjour.

    Ce que tu cherches à faire s'appelle de la programmation événementielle, c'est-à-dire exécuter une fonction lors d'un évènement précis, en l’occurrence quand une valeur du comboBox a changé.

    Qt propose un système de signaux qui sont lancés à un moment précis, et de slots, des fonctions qu'on accroche aux signaux pour qu'elles soit exécutées à ce moment là.

    Un peu de lecture pour commencer.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Points : 16
    Points
    16
    Par défaut
    Merci de ta réponse, mais j'ai du mal a voir comment les signaux et les slots vont m'aider pour mon problème : je voudrais que mon programme "s’arrête" lors de l'affichage d'une certaine fenêtre pour que l'utilisateur ait justement le temps de choisir un élément d'une liste (dont j'extrait la valeur à l'aide d'une fonction connect)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Points : 16
    Points
    16
    Par défaut
    Problème résolu!!

    il m'a suffit de virer le show(); qu'il y avait dans ma classe FenetreChoix et de mettre un exec() dans le main à la place, l'objet FenetreChoix passe en modal et le code arrête son exécution jusqu'à ce que l'objet FenetreChoix soit fermé .

    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
    #ifndef FENETRECHOIX
    #define FENETRECHOIX
     
    #include <QApplication>
    #include <QtWidgets>
    #include <QWidget>
    #include <QInputDialog>
     
     
     
     
    using namespace std;
     
    class FenetreChoix : public QDialog // On hérite de QWidget (IMPORTANT)
    {
        Q_OBJECT
     
        public :
        FenetreChoix();
        FenetreChoix(string chemin, vector<string> nom_defauts);
        int get_choix();
     
     
        public slots :
        void change_choix(int nvx);
     
        private :
        int choix;
        QVBoxLayout *layout;
        QComboBox *liste;
     
    };
     
     
     
    #endif


    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
     
     
     
     
    #include "FenetreChoix.h"
     
    FenetreChoix::FenetreChoix() : QDialog() {
     
     
    }
     
     
    FenetreChoix::FenetreChoix(string chemin, vector<string> nom_defauts) : QDialog()
    {
        setModal(true);
     
        setFixedSize(300, 150);
     
        layout = new QVBoxLayout;
     
        layout->setAlignment(Qt::AlignHCenter);
     
        QLabel *image = new QLabel(this);
        image->setPixmap(QPixmap(QString::fromStdString(chemin)));
        layout->addWidget(image);
     
        QLabel *texte = new QLabel("A quelle classe appartient l image?");
     
        layout->addWidget(texte);
     
        liste = new QComboBox(this);
     
        for(unsigned int i =0 ; i< nom_defauts.size() ; i++){
     
            liste->addItem(QString::fromStdString(nom_defauts[i]));
     
        }
     
        layout->addWidget(liste);
     
        QPushButton* confirmer = new QPushButton("Confirmer  ?",this);
     
        QObject::connect(confirmer, SIGNAL(clicked()), qApp, SLOT(quit()));
     
        QObject::connect(liste, SIGNAL(currentIndexChanged(int)), this, SLOT(change_choix(int)));
     
        layout->addWidget(confirmer);
     
        setLayout(layout);
     
        choix = liste->currentIndex();
     
        //show();
     
     
    }
     
     
    int FenetreChoix::get_choix(){
     
        return choix;
     
    }
     
    void FenetreChoix::change_choix(int nvx){
     
        choix = nvx;
     
    }


    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
     
     
    int main(int argc, char *argv[])
    {
     
        QApplication app(argc, argv);
     
        FenetreInitiale fenetre;
     
        vector< pair<string,string> > ens_appr = fenetre.base_apprentissage_classe();
     
        string chemin_appr_non_classe = fenetre.base_apprentissage_non_classe();
     
        string chemin_test = fenetre.base_test();
     
        for(unsigned int i = 0; i < ens_appr.size() ; i++ ){
     
            cout<<"Classe : "<< ens_appr[i].first <<endl;
            cout<<"Repertoire : "<< ens_appr[i].second <<endl;
            cout<<endl;
     
        }
     
        cout<<"Chemin appr non classe : "<< chemin_appr_non_classe <<endl;
     
        //fenetre.show();
     
        vector<const char*> chemin_apprentissage;
     
        vector<string> nom_defauts;
     
        for(unsigned int i = 0 ; i < ens_appr.size() ; i++){
     
            nom_defauts.push_back(ens_appr[i].first);
     
        }
     
        for(unsigned int i = 0 ; i < ens_appr.size() ; i++){
     
            chemin_apprentissage.push_back(ens_appr[i].second.c_str());
     
        }
     
     
        FenetreChoix fenetre_liste("C:\\data\\test_apprentissage_supervisee\\appr_comet1\\comet000001.bmp",nom_defauts);
     
        fenetre_liste.exec();
     
        cout<<"Classe selectionnee : "<< fenetre_liste.get_choix() <<endl;
     
        return app.exec();
     
     
    }

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

Discussions similaires

  1. Obtenir l'index de la ligne courante dans une repeating table
    Par stephane eyskens dans le forum InfoPath
    Réponses: 7
    Dernier message: 25/05/2007, 17h55
  2. Obtenir la couleur courante de la console
    Par spidermario dans le forum Windows
    Réponses: 2
    Dernier message: 14/05/2007, 13h57
  3. Obtenir l'année courante
    Par mask91 dans le forum C++
    Réponses: 1
    Dernier message: 01/03/2007, 15h01
  4. [VBA] Obtenir l'index dans un tableau à partir de sa valeur.
    Par Julien Dufour dans le forum Access
    Réponses: 2
    Dernier message: 28/07/2006, 11h03
  5. [VB.Net][2.0] Obtenir l'index d'une ligne d'un GridView
    Par Cyrilange dans le forum ASP.NET
    Réponses: 1
    Dernier message: 29/12/2005, 16h55

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