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 :

Envoi de paramètres avec un QPushButton

  1. #1
    Membre confirmé Avatar de timiti29
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 95
    Par défaut Envoi de paramètres avec un QPushButton
    Bonjour à tous !
    Je souhaite faire une fenêtre ou l'utilisateur tape son mot de passe vi des bouton !
    Donc j'ai fait ma fenêtre mais je n'arrive pas a faire ce que je veut :
    je voudrais que quand l'utilisateur click sur un bouton par exemple le bouton 1 appelé un slots personnalisé en lui envoyant 1
    Voici mon code :

    fenetrePassword.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
    30
    31
    32
    33
    34
    35
    36
    37
    #ifndef HEADER_FENETREPASSWORD
    #define HEADER_FENETREPASSWORD
     
    #include <QtGui>
     
    class fenetrePassword : public QDialog
    {
        Q_OBJECT
        public:
            fenetrePassword(QWidget *parent);
            ~fenetrePassword();
     
        public slots:
            void EntrerBoutton(int texte1);
     
        private:
            QLabel *label;
            QLineEdit *affichepassword;
            QPushButton *bouton1;
            QPushButton *bouton2;
            QPushButton *bouton3;
     
            QPushButton *bouton4;
            QPushButton *bouton5;
            QPushButton *bouton6;
     
            QPushButton *bouton7;
            QPushButton *bouton8;
            QPushButton *bouton9;
     
            QPushButton *bouton10;
            QPushButton *bouton11;
            QPushButton *bouton12;
            QGridLayout *layout;
    };
     
    #endif
    fenetrePassword.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
    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
    #include "fenetrePassword.h"
     
    fenetrePassword::fenetrePassword(QWidget *parent) : QDialog(parent)
    {
            setWindowTitle("fenetrePassword");
            setFixedSize(200,200);
            setWindowOpacity(1);
     
            label = new QLabel("Password: ");
     
            affichepassword = new QLineEdit();
            affichepassword->setAlignment(Qt::AlignRight);
            affichepassword->setReadOnly(true);
     
     
            bouton1 = new QPushButton("1");
            bouton2 = new QPushButton("2");
            bouton3 = new QPushButton("3");
     
            bouton4 = new QPushButton("4");
            bouton5 = new QPushButton("5");
            bouton6 = new QPushButton("6");
     
            bouton7 = new QPushButton("7");
            bouton8 = new QPushButton("8");
            bouton9 = new QPushButton("9");
     
            bouton10 = new QPushButton("*");
            bouton11 = new QPushButton("0");
            bouton12 = new QPushButton("#");
     
            layout = new QGridLayout;
            layout->addWidget(label, 0, 1, 1, 3);
            layout->addWidget(affichepassword, 1, 0, 1, 3);
            layout->addWidget(bouton1, 2, 0);
            layout->addWidget(bouton2, 2, 1);
            layout->addWidget(bouton3, 2, 2);
     
            layout->addWidget(bouton4, 3, 0);
            layout->addWidget(bouton5, 3, 1);
            layout->addWidget(bouton6, 3, 2);
     
            layout->addWidget(bouton7, 4, 0);
            layout->addWidget(bouton8, 4, 1);
            layout->addWidget(bouton9, 4, 2);
     
            layout->addWidget(bouton10, 5, 0);
            layout->addWidget(bouton11, 5, 1);
            layout->addWidget(bouton12, 5, 2);
     
            setLayout(layout);
     
            connect(bouton1, SIGNAL(clicked()), this, SLOT(EntrerBoutton(1)));
            connect(bouton2, SIGNAL(clicked()), this, SLOT(EntrerBoutton(2)));
            connect(bouton3, SIGNAL(clicked()), this, SLOT(EntrerBoutton(3)));
            connect(bouton4, SIGNAL(clicked()), this, SLOT(EntrerBoutton(4)));
            connect(bouton5, SIGNAL(clicked()), this, SLOT(EntrerBoutton(5)));
            connect(bouton6, SIGNAL(clicked()), this, SLOT(EntrerBoutton(6)));
            connect(bouton7, SIGNAL(clicked()), this, SLOT(EntrerBoutton(7)));
            connect(bouton8, SIGNAL(clicked()), this, SLOT(EntrerBoutton(8)));
            connect(bouton9, SIGNAL(clicked()), this, SLOT(EntrerBoutton(9)));
            //connect(bouton10, SIGNAL(clicked()), this, SLOT());
            connect(bouton11, SIGNAL(clicked()), this, SLOT(EntrerBoutton(0)));
            //connect(bouton12, SIGNAL(clicked()), this, SLOT());
    }
     
    fenetrePassword::~fenetrePassword()
    {
            delete label;
            delete affichepassword;
            delete bouton1;
            delete bouton2;
            delete bouton3;
     
            delete bouton4;
            delete bouton5;
            delete bouton6;
     
            delete bouton7;
            delete bouton8;
            delete bouton9;
     
            delete bouton10;
            delete bouton11;
            delete bouton12;
            delete layout;
    }
     
    void fenetrePassword::EntrerBoutton(int texte1)
    {
        QString texte2;
        texte2.setNum(texte1);
     
        QString texte3 = affichepassword->text() + texte2;
     
        affichepassword->setText(texte3);
    }
    Il me répond :
    Object::connect: No such slot fenetrePassword::EntrerBoutton(1)
    Quand je lance mon programme !
    Merci !

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 173
    Billets dans le blog
    155
    Par défaut
    Bonjour,

    J'ai ete confronte a un probleme similaire, et j'ai une solution (d'ailleurs, j'ai du cree un post sur ce forum, sur mon probleme, donc une recherche peu donner plus d'information)
    Mais dans tout les cas, la documentation, c'est tres bien

    Il vous faut cette classe magique:
    http://qt.developpez.com/doc/4.6/QSignalMapper/

    En suivant l'exemple vous devriez tres rapidement arrive a faire en sorte que cela fonctionne.

    Note: On ne peut pas passer de parametres aux slot, lors de la connection (d'ou votre erreur)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé Avatar de timiti29
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 95
    Par défaut
    Salut !
    Je ne comprend pas comment faire ?
    Car moi j'ai pleins de bouton !
    et dans les code que je trouve il son tous avec des tableaux !
    Moi je ne veut pas de tableaux !
    Et je ne comprend pas le fonctionnement de QSignalMapper !
    Comment faire ?
    Timiti29

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 173
    Billets dans le blog
    155
    Par défaut
    L'histoire des tableaux n'a aucune importance.

    Prenons les codes de l'exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class ButtonWidget : public QWidget
     {
         Q_OBJECT
     
     public:
         ButtonWidget(QStringList texts, QWidget *parent = 0);
     
     signals:
         void clicked(const QString &text);
     
     private:
         QSignalMapper *signalMapper;
     };
    et
    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
     
    ButtonWidget::ButtonWidget(QStringList texts, QWidget *parent)
         : QWidget(parent)
     {
         signalMapper = new QSignalMapper(this);
     
         QGridLayout *gridLayout = new QGridLayout;
         for (int i = 0; i < texts.size(); ++i) {
             QPushButton *button = new QPushButton(texts[i]);
             connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
             signalMapper->setMapping(button, texts[i]);
             gridLayout->addWidget(button, i / 3, i % 3);
         }
     
         connect(signalMapper, SIGNAL(mapped(const QString &)),
                 this, SIGNAL(clicked(const QString &)));
     
         setLayout(gridLayout);
    }
    Dans la déclaration de la classe, nous voyons:
    - Le constructeur de la classe (on s'en fout)
    - Un seul signal
    - un QSignalMapper

    Dans le code du constructeur nous voyons:
    - La construction du QSignalMapper
    - La construction d'une grid (on s'en fout)
    - Une boucle
    - - La construction du boutton (sur lequel on appuie donc)
    - - La connexion du clique du bouton sur le QSignalMapper
    - - On indique on QSignalMapper que si l'emetteur est le bouton actuelle, on envoie tel valeur (text[i]) mais cela marche aussi avec des nombres
    - - On ajoute le bouton dans le grid (on s'en fout)

    - Finalement, on connecte le signal du mapper sur le SLOT / SIGNAL que l'on veut, le mapper passera la valeur associé au bouton sur lequel on appuie, grace:
    -> à la connection que l'on a fait dans la boucle
    -> à l'appel de setMapping()

    Voilà
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    Je te conseille de relire à tête reposée le fonctionnement des signaux/slots.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     connect(bouton1, SIGNAL(clicked()), this, SLOT(EntrerBoutton(1)));
    Ce bout de code n'a pas de sens. En effet, il s'agit de "connecter" une fonction à une autre, et c'est la valeur des données passées en paramètres de la fonction signal qui seront les paramètres de la fonction slot.

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     connect(myLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(editTextChanged(const QString &));
    à un moment donné, Qt contient le code suivant (ou approchant):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    QString newText = ...;
    if (newText =! oldText)
    {
    emit textChanged(newText );
    }
    C'est donc la valeur de newText qui sera passée en paramètre de ton slot editTextChanged ; et cette valeur change en fonction du context ; c'est donc bien un paramètre variable qui sera échangé et non une valeur fixée lors du connect.

    Il n'est donc pas possible, lors du connect, de préciser une valeur ; il y a (au moins) 3 solutions à ton problème:

    1. créer ta propre class myButton, qui émettra un signal avec une valeur (le texte par exemple) lors du click ; ton slot récupèrera le texte et voilà.
    2. passer par un QSignalMapper comme l'a décrit @LittleWhite
    3. une solution rapide mais bien dégueu: utiliser sender(), qui retourne un QObject * pointant vers l'émetteur du signal, puis cast et autres joyeusetés. C'est pas beau, mais pour un prototype ça peut suffire.

  6. #6
    Membre confirmé Avatar de timiti29
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 95
    Par défaut
    Salut !
    Je voudrais bien utiliser QSignalMapper mais je ne comprend pas le fonctionnement !
    et en plus je ne trouve pas de documentation en Français !
    avec des exemples concret !
    Car donné un bout de code ou il manque la moitié cela ne m'aide pas !
    (Dans le cas du code de "LittleWhite")
    Merci à tous de me donné de la doc en français avec des exemples complet et concret !
    Timiti29

  7. #7
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Par défaut
    Citation Envoyé par timiti29 Voir le message
    Merci à tous de me donné de la doc en français avec des exemples complet et concret !
    Bonjour,

    Le projet de la documentation de Qt en Français est un énorme projet commencé par l'équipe Qt et qui comporte actuellement 100 pages traduites ce qui représente un peu près 10% du total actuel. La classe que tu désire n'a pas encore été traduite mais si tu désires participer à ce projet tu es le bienvenue.

    Bonne continuation.

  8. #8
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    Bonjour,

    Je pense que les explications de LittleWhite sont assez claires .

    En fait, lorsque tu cliques sur un bouton, tu vas appeler le slot "map()" du QSignalMapper qui va envoyer ton signal au slot que tu veux appeler (que tu auras ajouté avant avec setMapping).

  9. #9
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 173
    Billets dans le blog
    155
    Par défaut
    Le point est que, le code de l'exemple explique le fonctionne de QSignalMapper.
    Je vais essayer de le redécrir ici.

    Nous connections les signaux que de nos boutons (ou autre) au SLOT(map())
    Après nous indiquons avec setMapping, que lors de la réception de ce signal, venant de ce bouton, nous utilisons une telle valeur.
    La valeur est renvoyé par le signal 'mapped()' du QSignalMapper ... lequel on doit connecter notre SLOT / SIGNAL qui nous faut (donc celui auquel vous vouliez faire un truc étrange du genre: 'EntrerBoutton(0)'

    Donc en résumé:

    Le QSignalMapper, reçoit des signaux, auquel il doit avoir une valeur d'assigner selon l'objet qui a envoigné le signal.
    Une le signal reçu, il relance un signal (mapped()), avec la valeur assigné à l'objet envoyeur.

    Sinon, vous demandez un morceau de code tout prêt, j'ai l'impression ... sauf que votre programme, personne ne l'écrira. La documentation de QSignalMapper explique juste comment utiliser QSignalMapper, car, cette classe peut être utilisé dans beaucoup plus de cas, que le simple cas que vous décrivez.

    Après, je vous ai parlé sur le chat ... hier soir (Samedi soir) et vous aviez un code qui me semblez correct (mais qui ne compilait pas encore) pourquoi ne pas continuer sur cette lancée ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  10. #10
    Membre confirmé Avatar de timiti29
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 95
    Par défaut
    Merci !!!
    Après ces explication j'ai réussi !
    En faite pour l'instant ce n'est pas très compliquer !
    Sur ce, MERCI !!!!
    Je poste mon code pour ceux qui le voudrais :

    fenetrePassword.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
    #ifndef HEADER_FENETREPASSWORD
    #define HEADER_FENETREPASSWORD
     
    #include <QtGui>
     
    class fenetrePassword : public QDialog
    {
        Q_OBJECT
        public:
            fenetrePassword(QWidget *parent);
            ~fenetrePassword();
     
        public slots:
            void EntrerBoutton(int);
     
        private:
            QLabel *label;
            QLineEdit *affichepassword;
            QPushButton *boutons[12];
            QGridLayout *layout;
     
            QSignalMapper *signalmapper;
    };
     
    #endif
    fenetrePassword.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
    57
    58
    59
    60
    61
    62
    63
    #include "fenetrePassword.h"
     
    fenetrePassword::fenetrePassword(QWidget *parent) : QDialog(parent)
    {
            //Fenetre :
            setWindowTitle("fenetrePassword");
            setFixedSize(200,200);
            setWindowOpacity(1);
            //Label :
            label = new QLabel("Password: ");
            //QLineEdit pour afficehr le mot de passe :
            affichepassword = new QLineEdit();
            affichepassword->setAlignment(Qt::AlignRight);
            affichepassword->setReadOnly(true);
     
            //On cree un QGridLayout pour placer les boutons !
            layout = new QGridLayout;
            layout->addWidget(label, 0, 1, 1, 3);
            layout->addWidget(affichepassword, 1, 0, 1, 3);
     
            signalmapper = new QSignalMapper(this);
            connect(signalmapper, SIGNAL(mapped(int)), this, SLOT(EntrerBoutton(int)));
     
            //On cree les bouton :
            for (int i = 0; i < 12; ++i)
            {
                QString text = QString::number(i+1);
                boutons[i] = new QPushButton(text, this);
     
                if (i == 10)
                {
                    signalmapper->setMapping(boutons[i], 11);
                    boutons[10]->setText("0");
                }
                else
                {
                    signalmapper->setMapping(boutons[i], i+1);
                }
                connect(boutons[i], SIGNAL(clicked()), signalmapper, SLOT(map()));
                layout->addWidget(boutons[i], static_cast<unsigned int>(i/3)+2, i%3);
            }
            boutons[9]->setText("*");
            boutons[11]->setText("#");
     
            setLayout(layout);//on ajoute le layout a la fenetre
    }
     
    //Slot Perso :
    void fenetrePassword::EntrerBoutton(int bouton)
    {
        QString texte1 = QString::number(bouton);
        //texte1.setNum(bouton);
        affichepassword->setText(texte1);
    }
    //destructeur de la classe :
    fenetrePassword::~fenetrePassword()
    {
            delete label;
            delete affichepassword;
            //delete boutons;
            delete layout;
            delete signalmapper;
    }
    Voila !
    Et Merci encore !
    Timiti29

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    Citation Envoyé par timiti29 Voir le message
    Salut !
    Je voudrais bien utiliser QSignalMapper mais je ne comprend pas le fonctionnement !
    et en plus je ne trouve pas de documentation en Français !
    avec des exemples concret !
    Car donné un bout de code ou il manque la moitié cela ne m'aide pas !
    (Dans le cas du code de "LittleWhite")
    Merci à tous de me donné de la doc en français avec des exemples complet et concret !
    Timiti29
    Bonjour,

    Juste pour rajouter une couche: Developpez.com est un site communautaire. Les réponses qui sont postées ici le sont parce que des gens prennent sur leur temps libre pour répondre.
    Le but est également de faire progresser les membres, en leur donnant des pistes et en leur indiquant où trouver les informations.

    Si ce que tu recherches, c'est un support complet sur Qt, qui t'explique complètement ce que tu dois faire, et qui fait ton boulot à ta place, tu n'es pas au bon endroit ; je te conseille donc de contacter le commercial de chez Qt Software pour la France (si tu veux son mail n'hésite pas), qui se fera un plaisir de t'orienter vers un partenaire pour une mission de conseil et de service personnalisé.

    Cependant, si l'esprit communautaire te suffit, je ne peux que seconder John: n'hésite pas à consacrer, comme les autres (même si je ne suis que nouveau venu), un peu de ton temps à améliorer le site, pour le bien de tous !

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

Discussions similaires

  1. Envoi de paramètre popup --> parent avec rechargement par
    Par senacle dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/06/2018, 17h59
  2. Réponses: 4
    Dernier message: 24/08/2009, 14h56
  3. Réponses: 26
    Dernier message: 09/07/2009, 10h55
  4. Envoi de paramètre avec un lien href
    Par lanfeust42 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 24/04/2009, 14h51
  5. Envoie de paramétre avec un bouton
    Par nikoo_27 dans le forum Struts 1
    Réponses: 2
    Dernier message: 01/12/2006, 11h25

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