[Qt] connect() ne fonctionne pas
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

[Qt] connect() ne fonctionne pas



  1. #1
    lawliet yagami

    [Qt] connect() ne fonctionne pas


    ------

    Bonjour,
    J'aimerai afficher un formulaire dynamique dans une fenêtre (en cliquant sur un bouton on rajoute un ligne, et en appuyant sur un autre bouton on efface une ligne).
    J'ai crée une classe fenêtre qui sert juste à contenir les Widget.
    Une classe champ qui contient les différent champ pour décrire une personne (nom prénom adresse age )
    Une classe formulaire qui contient plusieurs champ + 2 boutons pour agrandir/rétrécir le formulaire.
    Si j'ai mis un pointeur vers la fenêtre principale dans la classe formulaire c'est pour contourner le fait que les signaux et les slot doivent avoir les même argument.

    J'avais réussi à le faire pour un seul widget et j'ai donc adapté le code pour le formulaire... sauf que le signal/slot ne fonctionne pas(j'ai remplacé le code de la fonction ajoute_champ() par un QMessageBox::information(le code) et rien n'est apparu ).

    Fichier main.cpp
    Code:
    #include <QApplication>
    #include <QtGui>
    #include "fenetre.h"
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        fenetre win(5);//j'initialise le nombre de ligne à 5
        win.show();
    
        return app.exec();
    }
    champ.h
    Code:
    #ifndef CHAMP_H
    #define CHAMP_H
    
    #include <QApplication>
    #include <QtGui>
    
    class champ
    {
    public:
        champ(QWidget *pointeur_fenetre,qint32 i);
        void affiche();
    private:
        QLineEdit *m_nom;
        QLineEdit *m_prenom;
        QLineEdit *m_adresse;
        QSpinBox *m_age;
    };
    
    #endif // CHAMP_H
    champ.cpp
    Code:
    #include "champ.h"
    
    champ::champ(QWidget* pointeur_fenetre, qint32 i )
    {
        m_nom=new QLineEdit("Entrez votre nom",pointeur_fenetre);
        m_prenom=new QLineEdit("Entrez votre prenom",pointeur_fenetre);
        m_adresse=new QLineEdit("Entrez votre adresse",pointeur_fenetre);
        m_age=new QSpinBox(pointeur_fenetre);
        m_nom->move(20,40+50*i);
        m_prenom->move(200,40+50*i);
        m_adresse->move(380,40+50*i);
        m_age->move(560,40+50*i);
    }
    
    void champ::affiche()
    {
        m_nom->show();
        m_prenom->show();
        m_adresse->show();
        m_age->show();
    }
    formulaire.h
    Code:
    #ifndef FORMULAIRE_H
    #define FORMULAIRE_H
    
    #include <QApplication>
    #include <QtGui>
    
    #include "champ.h"
    #include "fenetre.h"
    class champ;
    class fenetre;
    
    class formulaire: public QWidget
    {
        Q_OBJECT
    public:
        formulaire(qint32 taille, fenetre *pointeur_fenetre);
    public slots:
        void ajoute_champ();
        void enleve_champ();
    private:
        QVector<champ*> m_formulaire;
        QPushButton* m_ajoute;
        QPushButton* m_enleve;
        fenetre*  pointeur;
    };
    
    #endif // FORMULAIRE_H
    formulaire.cpp
    Code:
    #include "formulaire.h"
    
    formulaire::formulaire(qint32 taille,fenetre* pointeur_fenetre)
    {
        this->pointeur=pointeur_fenetre;
        qint32 i;
        for(i=0;i<taille;i++)
        {
            champ* champ_i = new champ(pointeur_fenetre,i);
            m_formulaire.push_back(champ_i);
        }
        m_ajoute= new QPushButton("ajouter",this->pointeur);
        m_ajoute->move(10,10);
        m_enleve= new QPushButton("effacer",this->pointeur);
        m_enleve->move(200,10);
        QObject::connect(m_ajoute,SIGNAL(clicked()), this, SLOT(ajoute_champ()));
        QObject::connect(m_enleve,SIGNAL(clicked()), this, SLOT(enleve_champ()));
    }
    
    void formulaire::ajoute_champ()
    {
        qint32 taille;
        taille=m_formulaire.size();
        champ* champ_i=new champ(this->pointeur,taille);
        m_formulaire.push_back(champ_i);
        champ_i->affiche();
    }
    
    void formulaire::enleve_champ()
    {
        qint32 taille;
        taille=m_formulaire.size();
        if(taille>1)
        {
            delete m_formulaire[taille-1];
            m_formulaire.erase(m_formulaire.begin()+taille-1);
        }
    }
    fenetre.h
    Code:
    #ifndef FENETRE_H
    #define FENETRE_H
    
    #include <QApplication>
    #include <QtGui>
    #include "formulaire.h"
    
    class formulaire;
    class fenetre: public QWidget
    {
        Q_OBJECT
    public:
        fenetre(qint32 i);
    };
    
    #endif // FENPRINCIPALE_H
    fenetre.cpp
    Code:
    #include "fenetre.h"
    
    fenetre::fenetre(qint32 i)
    {
        formulaire form(i,this);
    }

    Merci d'avance

    -----
    Dernière modification par lawliet yagami ; 02/02/2013 à 23h07.

  2. #2
    Jack
    Modérateur

    Re : [Qt] connect() ne fonctionne pas

    As-tu vérifié que c'était bien le connect qui ne fonctionnait pas et testant sa valeur de retour?

    A+

  3. #3
    whoami

    Re : [Qt] connect() ne fonctionne pas

    Bonjour,

    Je n'ai pas lu tout le code, mais il est possible que :

    Le SIGNAL d'un PushButton est Clicked(bool), et Qt n'aime pas beaucoup que les paramètres du SIGNAL et du SLOT connectés soient différents.

    Il vaudrait donc mieux avoir, même si tu n'utilises pas la valeur du paramètre :
    Code:
    ...
    public slots:
        void ajoute_champ(bool ex);
    ...
    
    
    void formulaire::ajoute_champ(bool)
    {
        qint32 taille;
        taille=m_formulaire.size();
    
    ...
    Et pour le connect :
    Code:
        QObject::connect(m_ajoute,SIGNAL(clicked(bool)), this, SLOT(ajoute_champ(bool)));

  4. #4
    Jack
    Modérateur

    Re : [Qt] connect() ne fonctionne pas

    je n'ai jamais mis de paramètre dans un signal clicked, sans avoir jamais rencontré le moindre problème. D'ailleurs ce paramètre est facultatif car initialisé à false.

  5. A voir en vidéo sur Futura
  6. #5
    whoami

    Re : [Qt] connect() ne fonctionne pas

    Bonjour,

    Qu'il soit initialisé à false ne concerne pas connect, qui ne vérifie rien, et il est bon de lui rappeler.

    Ne pas oublier une règle d'or de la programmation : ne jamais vouloir gagner quelques caractères à préciser dans le code, au mépris de la cohérence.

    Et dans le cas qui nous intéresse, même si on ne précise pas les types des paramètres dans le connect, il faudrait que SIGNAL et SLOT aient le même nombre de paramètres, du même type.

    Personnellement, je ne déclare jamais de paramètres avec une valeur par défaut, ça conduit trop souvent à des bug difficiles à trouver, car à force de compter sur cette valeur "automatique", on finit par oublier qu'elle existe.
    C'est bien entendu peu probable tant qu'on est dans le développement d'un projet, mais quand on le reprend plus tard (quelques années, parfois !), c'est vite problématique.

  7. #6
    lawliet yagami

    Re : [Qt] connect() ne fonctionne pas

    Bonjour,
    Merci pour vos réponse.
    L'erreur était dans fenêtre.cpp : il fallait déclarer le formulaire dynamiquement pour que ça marche (enfin seulement ajoute_champ() fonctionne pour l'instant mais je pense mettre moins de temps à régler ce problème )

  8. #7
    Jack
    Modérateur

    Re : [Qt] connect() ne fonctionne pas

    Qu'il soit initialisé à false ne concerne pas connect, qui ne vérifie rien
    En tout cas c'est bien en testant la valeur de retour de connect que je teste la connexion du signal au slot lorsque ça n'a pas l'air de fonctionner.

  9. #8
    whoami

    Re : [Qt] connect() ne fonctionne pas

    Bonjour,

    Évidemment, comme il faut toujours le faire, pour toutes les fonctions dont le retour permet de tester la validité.

    Combien de plantages parce que le programmeur néglige ce genre de contrôles, entre autres, le retour de malloc, que je trouve presque systématiquement ignoré dans les programmes que je dois reprendre ?

Discussions similaires

  1. Alimentation PC portable : fonctionne ? fonctionne pas ?
    Par invitef57a974b dans le forum Matériel - Hardware
    Réponses: 9
    Dernier message: 26/07/2012, 06h54
  2. lcd fonctionne // printf ne fonctionne pas
    Par invite60546543 dans le forum Électronique
    Réponses: 12
    Dernier message: 04/07/2011, 22h37
  3. Grand Servomoteur fonctionne pas, alors que petit fonctionne
    Par victorjung dans le forum Électronique
    Réponses: 3
    Dernier message: 04/02/2011, 21h45
  4. pc ecran noir pas d'amorce fonctionne pas
    Par superspops dans le forum Matériel - Hardware
    Réponses: 2
    Dernier message: 26/05/2006, 15h30
  5. mes javascript:popupimage ne fonctionne pas sur mon site web mais fonctionne en local
    Par invite4ff499e4 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 6
    Dernier message: 28/01/2006, 17h31