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 :

Utilisation des ComboBox et des connecteurs SIGNAL SLOT

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2019
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2019
    Messages : 31
    Points : 22
    Points
    22
    Par défaut Utilisation des ComboBox et des connecteurs SIGNAL SLOT
    Bonsoir,

    J'essaie de me convertir au C++ et donc je débute en C++ et Qt.

    Je voudrais essayer de comprendre comment afficher les items d'un QComboBox dans une fenêtre de dialogue avec les connecteurs SIGNAL/SLOT.

    Voici mon fichier Tcombobox.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
    #ifndef TCOMBOBOX_H
    #define TCOMBOBOX_H
        #include <QApplication>
        #include <QWidget>
        #include <QDialog>
        #include <QStringList>
        #include <QList>
     
        namespace Ui { class TcomboBox; }
     
        class TcomboBox : public QDialog
        {
            Q_OBJECT
     
        public:
            explicit TcomboBox(QWidget *parent = nullptr);
            void AjouterItems();
     
     
            ~TcomboBox();
     
        private:
            Ui::TcomboBox *ui;
            QList<QString> *vListe;
        };
     
    #endif // TCOMBOBOX_H
    et voici mon fichier Tcombobox.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
    #include "tcombobox.h"
    #include "ui_tcombobox.h"
     
    TcomboBox::TcomboBox(QWidget *parent) : QDialog(parent),
     
        ui(new Ui::TcomboBox)
    {
        ui->setupUi(this);
     
        // Ajout d'Items 'en dur'
            ui->CboTravail->addItem("Session de travail");
            ui->CboTravail->addItem("Session de Restauration");
     
        // Ajout d'Items avec QList dans le constructeur
            QList<QString> LListe;
            int i;
            for (i = 2000; i < 2010; ++i)
            { LListe.append(QString::number(i) + '/' + QString::number(i+1)); };
            ui->CboList->addItems(LListe);
     
        // Ajout d'Items avec QList à partir d'une fonction
            vListe = new QList<QString>;
            ui->CboSession->showPopup();
     
        // Connection aux fonctions
     
            // Connection du Bouton "BtnQuitter"
            QObject::connect(ui->BtnQuitter,SIGNAL(clicked()),this,SLOT(close()));
     
            // Connection du ComboBox "CboSession"
            QObject::connect(ui->CboSession,SIGNAL(currentText()),this,SLOT(AjouterItems()));
    }
     
    void TcomboBox::AjouterItems()
    {
        for (int i = 2000; i < 2010; ++i)
        {
            vListe->append(QString::number(i)+'/'+QString::number(i+1));//vListe est déclaré dans Tcombobox en private
        };
    }
     
    TcomboBox::~TcomboBox()
    { delete ui; }
    et mon fichier Tcombobox.ui
    Code xml : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>TcomboBox</class>
     <widget class="QDialog" name="TcomboBox">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>505</width>
        <height>300</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>Teste Utilistaion QComboBox</string>
      </property>
      <widget class="QLabel" name="LblTitre">
       <property name="geometry">
        <rect>
         <x>140</x>
         <y>20</y>
         <width>220</width>
         <height>22</height>
        </rect>
       </property>
       <property name="palette">
        <palette>
         <active>
          <colorrole role="WindowText">
           <brush brushstyle="SolidPattern">
            <color alpha="255">
             <red>0</red>
             <green>0</green>
             <blue>255</blue>
            </color>
           </brush>
          </colorrole>
         </active>
         <inactive>
          <colorrole role="WindowText">
           <brush brushstyle="SolidPattern">
            <color alpha="255">
             <red>0</red>
             <green>0</green>
             <blue>0</blue>
            </color>
           </brush>
          </colorrole>
         </inactive>
         <disabled>
          <colorrole role="WindowText">
           <brush brushstyle="SolidPattern">
            <color alpha="255">
             <red>120</red>
             <green>120</green>
             <blue>120</blue>
            </color>
           </brush>
          </colorrole>
         </disabled>
        </palette>
       </property>
       <property name="font">
        <font>
         <pointsize>12</pointsize>
         <bold>true</bold>
        </font>
       </property>
       <property name="text">
        <string>Utilisation des ComboBox</string>
       </property>
       <property name="alignment">
        <set>Qt::AlignCenter</set>
       </property>
      </widget>
      <widget class="QComboBox" name="CboTravail">
       <property name="geometry">
        <rect>
         <x>50</x>
         <y>80</y>
         <width>151</width>
         <height>22</height>
        </rect>
       </property>
      </widget>
      <widget class="QPushButton" name="BtnQuitter">
       <property name="geometry">
        <rect>
         <x>420</x>
         <y>260</y>
         <width>75</width>
         <height>24</height>
        </rect>
       </property>
       <property name="text">
        <string>Quitter</string>
       </property>
      </widget>
      <widget class="QComboBox" name="CboList">
       <property name="geometry">
        <rect>
         <x>300</x>
         <y>80</y>
         <width>81</width>
         <height>22</height>
        </rect>
       </property>
      </widget>
      <widget class="QComboBox" name="CboSession">
       <property name="geometry">
        <rect>
         <x>180</x>
         <y>150</y>
         <width>131</width>
         <height>22</height>
        </rect>
       </property>
      </widget>
     </widget>
     <resources/>
     <connections/>
    </ui>

    Mon problème est que le comboBox "CboSession" n'affiche rien.

    Et dans l'onglet "Application output" de l'IDE j'ai le message suivant :

    No such signal QComboBox::currentText() in ..\Bourse\bourse.cpp:31
    Ma question : Comment afficher les items de CboSession sur la forme en utilisant SIGNAL/SLOT qu’apparemment je ne maitrise pas.

    Merci pour m'aider à comprendre l'utilisation de "SIGNAL / SLOT".
    Bonne soirée.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Si tu consultes la documentation de la classe QComboBox, tu y verras que currentText() n'est pas un signal, mais le moyen d'accès à la propriété.
    Le signal rattaché lorsque celle-ci est modifiée est currentTextChanged(), à savoir lorsque le texte de ta comboBox est modifié.

    Par contre, j'ai du mal à comprendre ce que tu attends de ce code .

    Remarque : il n'est pas nécessaire d'utiliser une pointeur pour ton membre vListe.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2019
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2019
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    Bonsoir,

    Merci pour vos remarques.
    Même en changeant avec currentTextChanged(), il n y a pas d'affichage d'items.
    Je voudrais simplement reproduire le résultat obtenu sur le comboBox CboList (ligne 14 à 19 dans mon fichier cpp) mais en METTANT mon code dans une méthode (void TcomboBox::AjouterItems()) pour l'affichage des Items de CboSession, Ceci dit si cela est possible.

    Bonne fin de soirée.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Le fait est qu'au sein de AjouterItems() (qui en passant n'est pas marqué en tant que slots, chose nécessaire si tu utilises les macros obsolètes SIGNAL/SLOT plutôt que la nouvelle syntaxe), tu n'ajoutes rien à ta QComboBox. Tu ne fais qu'ajouter des éléments à ta QList.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2019
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2019
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    Oui les éléments sont ajoutés à la QList vListe SEULEMENT.
    Comment ajouter un QList au QComboBox schématiquement?

    Car le QComboBox CboSession->addItems(vListe) me donne une erreur :
    error: reference to type 'const QStringList' (aka 'const QList<QString>') could not bind to an lvalue of type 'QList<QString> *'
    1- Je vais essayer la nouvelle syntaxe de connexion pour les SIGNAUX et SLOTS.
    2- Puis je avoir un exemple d’écriture pour l'ajout d'Items au QComboBox à travers un QList.

    Bonne fin de soirée.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Si tu avais suivi mon conseil
    Citation Envoyé par Winjerome Voir le message
    Remarque : il n'est pas nécessaire d'utiliser une pointeur pour ton membre vListe.
    tu n'aurais pas eu ce problème .

    Afin d'accéder à la QList, il te faut déréférencer le pointeur. Sinon ça reste la même chose que tu as fait dans ton constructeur.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2019
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2019
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    Bonsoir,

    Voilà ou j'en suis de mon apprentissage :

    Mon nouveau tcombobox.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
     
    #ifndef TCOMBOBOX_H
    #define TCOMBOBOX_H
        #include <QApplication>
        #include <QWidget>
        #include <QDialog>
        #include <QStringList>
        #include <QList>
     
        namespace Ui { class TcomboBox; }
     
        class TcomboBox : public QDialog
        {
            Q_OBJECT
     
        public:
            explicit TcomboBox(QWidget *parent = nullptr);
            void AjouterItems();
     
     
            ~TcomboBox();
     
        protected:
            Ui::TcomboBox *ui;
     
            // Déclarer et Déréférencer vListe
            QList<QString> *vListe{nullptr};
        };
    #endif // TCOMBOBOX_H
    Mon nouveau tcombobox.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
     
    #include "tcombobox.h"
    #include "ui_tcombobox.h"
     
    TcomboBox::TcomboBox(QWidget *parent) : QDialog(parent),
     
        ui(new Ui::TcomboBox)
    {
        ui->setupUi(this);
     
        // Ajout d'Items 'en dur'
            ui->CboTravail->addItem("Session de travail");
            ui->CboTravail->addItem("Session de Restauration");
     
        // Ajout d'Items avec QList dans le constructeur
            QList<QString> LListe;
            int i;
            for (i = 2000; i < 2010; ++i)
            { LListe.append(QString::number(i) + '/' + QString::number(i+1)); };
            ui->CboList->addItems(LListe);
     
        // Ajout d'Items avec QList à partir d'une fonction
            // vListe Déclarer et Déréférencer dans tcombobox.h
            // Initialisation de vListe
                vListe = new QList<QString>;
     
        // Connection aux fonctions
     
    /*
    Utilisation de la nouvelle syntaxe pour les connections au lieu de SIGNAL/SLOT:
     
    connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue);
    */
     
    QObject::connect(ui->BtnQuitter, &QPushButton::clicked, this, close());
    // au lieu de :
    QObject::connect(ui->BtnQuitter, SIGNAL(clicked()), this, SLOT(close()));
    }
     
    void TcomboBox::AjouterItems()
    {
        for (int i = 2000; i < 2010; ++i)
        {
            vListe->append(QString::number(i)+'/'+QString::number(i+1));
            //ui->CboSession->addItems(vListe);
        };
        QString Message;
        Message = "Bien";
        if (vListe != nullptr)
            {ui->EdtMessage->setText(Message);}
        else
            {ui->EdtMessage->setText("Pas " + Message);}
    }
     
    TcomboBox::~TcomboBox()
    { delete ui; }
    1° Est ce que la réécriture du pointeur vListe est correcte?
    2° Oui je peux passe par une variable au lieu d'un pointeur. Merci pour ta remarque.
    3° je bloque sur l'écriture de la nouvelle syntaxe pour les connections

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(ui->BtnQuitter, &QPushButton::clicked, this, close());
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(ui->BtnQuitter, SIGNAL(clicked()), this, SLOT(close()));
    Merci pour tes lumières.
    Bonne fin de soirée.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Alidalger Voir le message
    1° Est ce que la réécriture du pointeur vListe est correcte?
    Tu n'as fait que commenter la ligne en question, donc… non ?
    Citation Envoyé par Alidalger Voir le message
    2° Oui je peux passe par une variable au lieu d'un pointeur. Merci pour ta remarque.
    Tu devrais*.
    Il n'y a aucune raison d'utiliser un pointeur pour cela, d'autant que tu ne sembles pas les maîtriser.
    Et ici, déréférencer vListe avant de vérifier sa nullité est une porte grande ouverte pour de l'Undefined Behaviour.
    Citation Envoyé par Alidalger Voir le message
    3° je bloque sur l'écriture de la nouvelle syntaxe pour les connections
    Le slot également est à passer sous la forme &LaClasse::leSlot.

Discussions similaires

  1. Utilisation des ComboBox
    Par furiousdraz dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 15/07/2008, 18h23
  2. Problème d'utilisation des ComboBox
    Par CyberSlan dans le forum MFC
    Réponses: 8
    Dernier message: 06/06/2008, 16h12
  3. Réponses: 2
    Dernier message: 16/11/2007, 13h39
  4. Construire un critère de filtre en utilisant des ComboBox
    Par mary17 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 20/04/2007, 09h19
  5. Questions concernant l'utilisation des ComboBox
    Par philguio dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/01/2007, 11h26

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