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 :

Savoir sur quel bouton on a cliqué

  1. #1
    Membre du Club
    Femme Profil pro
    Apprentie Développeuse
    Inscrit en
    Février 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Apprentie Développeuse
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 106
    Points : 44
    Points
    44
    Par défaut Savoir sur quel bouton on a cliqué
    Bonjour , je débute en qt et j'ai une interface avec plusieurs boutons qui ont le même SLOT , je voudrais pouvoir récupérer le bouton sur lequel l'utilisateur a cliqué puis afficher un message or je n'arrive pas à savoir sur quel bouton a été cliqué.
    Voici mon code , merci d'avance pour l'aide que vous pourriez m'apporter

    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
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        setMouseTracking(true); // suivit de la souris activé
        pushButton_2 = new QPushButton("okkk",this);
        pushButton = new QPushButton("oui",this);
        pushButton_2->move(80,180);
        pushButton->move(100,41);
        //pushButton_2->show();
        QObject::connect(pushButton_2,SIGNAL(clicked()),this,SLOT(ouvrirFen()));
        QObject::connect(pushButton,SIGNAL(clicked()),this,SLOT(ouvrirFen()));
     
     
     
    }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void MainWindow::ouvrirFen(){
            QMessageBox::information(this, "btn oui", "alalallalalallalala");
     
        }
     
    }

  2. #2
    Rédacteur/Modérateur
    Avatar de arnolddumas
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Autriche

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 978
    Points : 7 764
    Points
    7 764

  3. #3
    Membre du Club
    Femme Profil pro
    Apprentie Développeuse
    Inscrit en
    Février 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Apprentie Développeuse
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 106
    Points : 44
    Points
    44
    Par défaut
    merci beaucoup de ta réponse , j'avais vu ce topic mais je est-il possible de passer par autre chose qu'un signal mapper

    en fait je voulais utiliser un condition par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     if(monbuton.clicked()==true){
           faire quelque chose
    }
    else {
        faire autre chose
    }

  4. #4
    Rédacteur/Modérateur
    Avatar de arnolddumas
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Autriche

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 978
    Points : 7 764
    Points
    7 764
    Par défaut
    Non tu ne pourras pas faire comme ça. Si tu n'as que très peu de boutons, tu peux créer des slots dédiés à chaque bouton. Si tu ne veux pas utiliser de QSignalMaper, tu peux utiliser sender() pour récupérer le bouton qui a appelé le slot.

  5. #5
    Membre du Club
    Femme Profil pro
    Apprentie Développeuse
    Inscrit en
    Février 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Apprentie Développeuse
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 106
    Points : 44
    Points
    44
    Par défaut
    merci arnolddumas de ta réponse

    J'ai écrit un slot qui appel cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void MainWindow::buttonClicked(){
     
        QPushButton *button = (QPushButton *)sender();
        emit digitClicked(button->text()[0].digitValue());
    }
    mon but maintenant est que d'après mon emit je puisse récupérer la position du bouton dans une variable.
    Or je n'arrive pas à récupérer la position .. je voulais utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int résultat = buttonClicked()
    mais mon buttonClicked est du type void donc ne retourne rien .. je suis bloquée

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Front
    Inscrit en
    Décembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Front
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 59
    Points : 91
    Points
    91
    Par défaut
    Au pire, essaye de te faire un signal perso qui renvoie un int, et ton slot récupère ce int pour en déduire le sender... Genre, ton signal serait un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BoutonSender::BoutonSender(int indexBouton)
    {
        m_index = indexBouton;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void BoutonSender::clicked()
    {
         emit clickedOnButton(int m_index );
    }
    et après, ton slot sera de prototype
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void MainWindow::ouvrirFen(int bouton)
    {
        if (bouton == 1)
        {
            QMessageBox::information(this, "btn oui", "alalallalalallalala");
        }
        if (bouton == 2)
        {
            QMessageBox::information(this, "btn okkkk", "yavéyavéyavéyavé");
        }
    }
    Enfin, à adapter, j'ai jamais testé.

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

    On ne récupère pas la valeur émise par un emit par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    résultat = fonction_qui_envoi()

    emit digitClicked(button->text()[0].digitValue()); va émettre le signal digitClicked(int) porteur de la valeur passée en paramètre. Si tu veux récupérer cette valeur, il te faudra connecter un slot prenant un int dessus.

    @Nihilivin : cela ne revient ni plus ni moins à mimer le comportement interne d'un QSignalMapper.

    @juniordev : Je te conseille vraiment de revoir ta position quand à cette classe car c'est ce qu'il te faut ici.
    Un autre lien de la FAQ en passant : Comment récupérer et utiliser l'objet déclencheur d'un slot avec QSignalMapper ?

    PS : QPushButton *button = (QPushButton *)sender(); on préfèrera utiliser qobject_cast<>() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QPushButton *button = qobject_cast<QPushButton *>( sender() );
    if(button) {
        // ok le cast a réussi, on peut l'utiliser
    }

  8. #8
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 771
    Points : 43 964
    Points
    43 964
    Par défaut
    J'ai fait un système similaire.

    J'ai crée un SLOT par bouton, chaque slot appelant une même fonction appelant un pamètre, ce paramètre m'indiquant le bouton cliqué.

    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
     
    void methode_bouton1()
    {
      fonction_commune(1)
    }
     
    void methode_bouton2()
    {
      fonction_commune(2)
    }
     
    void fonction(int numero_bouton)
    {
    }

  9. #9
    Membre du Club
    Femme Profil pro
    Apprentie Développeuse
    Inscrit en
    Février 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Apprentie Développeuse
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 106
    Points : 44
    Points
    44
    Par défaut
    Bonjour

    déjà merci d'avoir pris le temps de me répondre !

    Nihilivin : t'es mon sauveur dit donc !! j'ai pensé à cette méthode il faut que je test

    Winjerome : j'ai essayé avec un signal mapper mais j'ai pas tout compris .. j'avais beaucoup d'erreur de compilation en plus


    chrtophe : c'est une bonne idée mais ça fait un peu lourd dans le code quand même ! comment je peux récupérer la position de mon bouton avec cette méthode ? position en pixel par rapport à la page ?

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur Front
    Inscrit en
    Décembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Front
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 59
    Points : 91
    Points
    91
    Par défaut
    A ce moment, il faudrait que ton slot appelle une méthode dudit bouton, cette méthode renvoyant les attributs de ton bouton, à savoir dimension et position.
    Et @chrtophe, nos méthodes sont identiques, sauf que tu fais une implémentation que je qualifierai de "rigide", càd une méthode par objet. Mieux vaudrait, pour alléger, à ce moment, faire une méthode générique renvoyant un attribut propre à chaque instance des objets.

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    De manière générale, j'aurais tendance à dire que ce que tu veux faire découle à la base d'un problème de conception .

    Je m'expliques :

    Tous les boutons cliquables ont permettent d'émettre un signal clicked() à destination "de toute personne intéressée par le fait de savoir qu'on a cliqué sur le bouton".

    Si "quelque chose" doit être en mesure de réagir au clique sur plusieurs boutons, il est sensé de se dire que sa réaction sera identique quel que soit le bouton sur lequel l'utilisateur a cliqué.

    Si la réaction doit être différente en fonction du bouton sur lequel l'utilisateur a cliqué, tu as très largement intérêt à faire en sorte que chaque réaction soit gérée de manière strictement séparée. Cela te facilitera énormément la tâche.

    La seule exception est le cas où tu as plusieurs instances d'un bouton donné qui est sensé occasionner la même réaction mais sur des données différentes (par exemple, quand le bouton correspond à une cellule particulière dans une vue tabulaire).

    Mais, à ce moment là, la "seule chose" qui t'intéresse, c'est l'index de la ligne du bouton sur lequel tu as cliqué afin de pouvoir récupérer la donnée correspondante

    Dés lors, la question est : Dans quelle situation te trouves tu dans la première (celle ou ce sont autant de boutons "décorellés") ou dans la deuxième (une vue tabulaire)

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

Discussions similaires

  1. Savoir sur quel bouton créé dynamiquement l'utilisateur a cliqué
    Par Pierre Fauconnier dans le forum Contribuez
    Réponses: 8
    Dernier message: 05/08/2011, 12h54
  2. Comment savoir sur quel bouton on a cliqué ?
    Par sarah65536 dans le forum Langage
    Réponses: 10
    Dernier message: 26/06/2009, 18h25
  3. savoir sur quel bouton l'utilisateur clique
    Par Mihalis dans le forum Delphi
    Réponses: 4
    Dernier message: 13/06/2007, 21h07
  4. [WinForms]comment savoir sur quel bouton j'ai cliqué?
    Par bossun dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 14/03/2006, 14h18
  5. Formulaire -> pour savoir sur quel bouton on a cliqué.
    Par Thierry8 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/09/2005, 18h53

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