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 :

Problème de signaux et de slots


Sujet :

Qt

  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 38
    Par défaut Problème de signaux et de slots
    Salut.
    Je suis entrain le programmer le jeu demineur avec qt. J'ai fais tout d'abord un tableau de QPushButton et un GridLayout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        QPushButton Btb[10][10];
        QGridLayout Lgrid;
    Puis, dans le constructeur de la fenetre principale j'ai rempli le grd par les boutons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            for (int i=0;i<10;i++)
            for(int j=0;j<10;j++)
            Lgrid.addWidget(&Btb[i][j],i,j,1,1);
     
            Lgrid.setHorizontalSpacing(0.5);
            Lgrid.setVerticalSpacing(0.5);
    Jusqu'à maintenant, tout allait bien. Le problème a apparu lorsque j'ai voulu assigner à chaque bouton le slot approprié. J'ai pensé au début à faire un slot relatif à ma fenetre appele "appuyer" qui prend comme parametres i et j, mon code devient ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i=0;i<10;i++)
                for(int j=0;j<10;j++)
                {
                QObject::connect(&Btb[i][j],SIGNAL(clicked()),this,SLOT(appuyer(i,j)));
            }
    Malheureusement, j'ai réalisé que le slot ne peut pas avoir des parametres (ou bien c'est ce que j'ai cru vu le message d'erreur).
    Donc, ma première question: est-t-il possible de faire un slot qui prend des parametres et qui peut etre utiilisé dans mon programme?

    J'ai réflechi ensuite à une autre méthode, et j'ai pensé à faire une classe "bouton" qui herite de "QPushButton" afin de lui attribuer un slot "appuyer", et tous mes boutons heritent ainsi de cette classe. Le code sera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i=0;i<10;i++)
                for(int j=0;j<10;j++)
                {
                QObject::connect(&Btb[i][j],SIGNAL(clicked()),&Btb[i][j],SLOT(appuyer()));
            }
    Encore une fois, ça n'a pas marché: Je ne sais pas comment doit etre le constructeur de "Bouton", et lorsque j'ai essayé de faire une chose simlaire au constructeur de la classe fenetre, c à d:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bouton(QPushButton *parent = 0);
    qt creator m'a affiché une erreur de compilation (je crois de type exit collect id, ou une chose comme ça)...
    Donc ma 2éme question est comment faire une classe qui hérite de QPushButton.
    Merci beaucoup.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 30
    Par défaut
    Si tu veux passer un paramètre dans un slot il faut utiliser un QSignalMapper :
    http://qt.developpez.com/doc/4.6/qsi...r.html#details

  3. #3
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut


    Citation Envoyé par prince_bouja Voir le message
    Malheureusement, j'ai réalisé que le slot ne peut pas avoir des parametres (ou bien c'est ce que j'ai cru vu le message d'erreur).

    Donc, ma première question: est-t-il possible de faire un slot qui prend des parametres et qui peut etre utiilisé dans mon programme?


    Principalement ceci : http://qt.developpez.com/faq/?page=signaux-slots
    En détail, http://qt.developpez.com/faq/?page=s...eer_signalslot

    Si tu veux passer des paramètres à un slot, il faut que le signal lui en envoie.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  4. #4
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 38
    Par défaut
    ça n'a pas marché
    j'ai fait un slot avec 2 parametres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //fenetre.h
    public slots:
        void appuyer(int,int);
    pour just essayer, je fais disparaitre le boutton lorsque j'appuis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //fenetre.cpp
    void Fenetre::appuyer(int i, int j)
    {
        Btb[i][j].hide();
    }
    enfin je fais la connexion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i=0;i<10;i++)
                for(int j=0;j<10;j++)
                {
                QObject::connect(&Btb[i][j],SIGNAL(clicked()),this,SLOT(appuyer(i,j)));
            }
    Qt creator souligne cette ligne en vert en indiquant que "i is not a type name". La complation se fait avec succes et la fenetre s'affiche, sauf qu'au moment de build, qt creator affiche 100 fois(nombre de boutons) "Object::connect: No such slot Fenetre::appuyer(i,j) in fenetre.cpp:20", et je découvre ensuite que la connexion a échoué.

    Est-ce qu'il ya quelqu'un qu peut m'expliquer cela, et qu'est ce que je dos modifier? Merci aussi de me repondre à ma question sur l'héritage.
    merci.

  5. #5
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Compare ton connect avec celui présenté ici : http://qt.developpez.com/faq/?page=s...ace_signalslot. Ne vois-tu pas une légère différence ?
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  6. #6
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 38
    Par défaut
    je vois bien la difference: connect doit etre comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(&Btb[i][j],SIGNAL(clicked(int,int)),this,SLOT(appuyer(int,int)));
    mais je ne comprend pas alors comment faire passer i et j en parametre??
    En plus,comment je peux modifier le signal "clicked()" de QPushButton pour le rendre "clicked(int,int)" ?

  7. #7
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Citation Envoyé par prince_bouja Voir le message
    mais je ne comprend pas alors comment faire passer i et j en parametre??
    En plus,comment je peux modifier le signal "clicked()" de QPushButton pour le rendre "clicked(int,int)" ?
    Les paramètres sont passés quand tu envoies le signal (tu fais un emit monSignal(param1, param2)).

    Pour tes paramètres, deux solutions :
    1. Dériver de QPushButton pour qu'il émette le signal comme tu le souhaites ; ou
    2. Utiliser un QSignalMapper (plus compliqué à mettre en place au début mais au final plus puissant). Cf. la FAQ ou ce QQ : http://qt-quarterly.developpez.com/qq-10/signalmapper/ (il me semble d'ailleurs que l'exemple correspond parfaitement à ce que tu veux faire mais il faut se souvenir de l'existence de la ressource).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  8. #8
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 38
    Par défaut
    merci pour la deuxieme solution, mais concernant la premiere, j'ai deja dit que j'avais essayé de faire une derivation de la classe QPushButton, et que le probleme que j'avais rencontré c'est comment doit etre le constructeur?

    merci bien de me repondre.

  9. #9
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Je dirais de prendre deux paramètres supplémentaires à la construction, l'emplacement du bouton dans la grille, tu les stockes quelque part.

    Pour ton constructeur, commence par choisir celui qui te convient. Au hasard,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QPushButton::QPushButton ( const QIcon & icon, const QString & text, QWidget * parent = 0 )
    Son prototype deviendra :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myQPushButton::myQPushButton ( const QIcon & icon, const QString & text, int x, int y, QWidget * parent = 0 )
    Pour l'implémentation, tu stockes x et y puis tu rends la main au constructeur du parent QPushButton (pour ce dernier point, retour à tes connaissances ou à tes bases de POO en C++).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

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

Discussions similaires

  1. problème avec signaux
    Par laracroft87 dans le forum Linux
    Réponses: 3
    Dernier message: 15/03/2025, 18h33
  2. [QtCore] Quelques questions sur les signaux et les slots
    Par simastion dans le forum PyQt
    Réponses: 13
    Dernier message: 09/01/2011, 14h20
  3. [QtCore] Problème de signaux et de slots
    Par benbannock dans le forum PyQt
    Réponses: 1
    Dernier message: 31/07/2010, 11h42
  4. Problème avec Q_Object et les SLOTS
    Par Shr3ck dans le forum Débuter
    Réponses: 3
    Dernier message: 06/04/2010, 13h56
  5. Problèmes de signaux
    Par asnaeb dans le forum C
    Réponses: 21
    Dernier message: 07/03/2010, 21h28

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