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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 145
    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 145
    Billets dans le blog
    150
    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 145
    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 145
    Billets dans le blog
    150
    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

+ 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, 16h59
  2. Réponses: 4
    Dernier message: 24/08/2009, 13h56
  3. Réponses: 26
    Dernier message: 09/07/2009, 09h55
  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, 13h51
  5. Envoie de paramétre avec un bouton
    Par nikoo_27 dans le forum Struts 1
    Réponses: 2
    Dernier message: 01/12/2006, 10h25

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