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 :

Connexion "directe" signal - slot


Sujet :

Qt

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 19
    Points
    19
    Par défaut Connexion "directe" signal - slot
    Bonjour,

    Je voudrais faire une application qui possède plusieurs onglets (QtabWidget). J'ai conçus l'interface avec le QT Designer et j'utilise QT 4.0 . Pour rendre le code plus lisible je veux mettre le code de chaque onglet dans une classe différente.

    Je n'arrive pas à connecter directement un signal de la classe principale (Form_Principale) avec un slot d'une classe (C_Tab_Projet) qui gère un onglet. Je doit passer par un slot de la classe principale ce dernier appel la fonction voulu: ce qui n'est pas très propre...
    Voici le code utilise (contient que les partis qui posent problème...):

    Le code de "FenetrePrincipal.hpp"
    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
    #include "TabProjet.hpp"
    #include "ui_Form_Principale.h"
     
    class Form_Principale : public QMainWindow {
        Q_OBJECT
    	public:
    		Form_Principale();
    	private:
                  Ui::Form_Principale ui;
    	private slots:
    		void SlotApropos();
    		/* Onglet projet */
    		void Slot_Projet_BDR_Parcourir();/***Le slot que je voudrais ne pas avoir à utiliser***/
    	private:
           C_Tab_Projet *Tab_Projet;/***La classe qui contient le slot a appeller***/
    };
    Le code de "FenetrePrincipal.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
    #include <QtGui>
    #include <QDialog>
    #include "FenetrePrincipale.hpp"
     
    /*Constructeur par défaut*/
    Form_Principale::Form_Principale(){
    	Tab_Projet=new C_Tab_Projet(); /** Instanciation de la classe
            ui.setupUi(this);
    }
     
    /*Création des action*/
    void Form_Principale::CreerActions(){
        /*** CE QUE JE VOUDRAIS FAIRE: POURQUOI CA MARCHE PAS????? ***/
    	//QObject::connect(ui.button_Projet_BDR_Parcourir, SIGNAL(clicked()), Tab_Projet, SLOT(Tab_Projet->BDR_Parcourir(this)));
        /*** celui qui marche : pas "propre"...***/
    	QObject::connect(ui.button_Projet_BDR_Parcourir, SIGNAL(clicked()), this, SLOT(Slot_Projet_BDR_Parcourir()));
    }
     
    /*** le slot que je voudrais ne pas avoir a utiliser ***/
    void Form_Principale::Slot_Projet_BDR_Parcourir(){
        Tab_Projet->BDR_Parcourir(this);
    }
    Le code de "TabProjet.hpp"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef TAB_PROJET_H
    #define TAB_PROJET_H
     
    #include <QWidget>
    #include <QObject>
     
    class C_Tab_Projet: public QObject{
        Q_OBJECT;
        public slots:
            void BDR_Parcourir(QWidget *);  //*** le slot que je veux appeller depuis la classe principal...
    };
    Le code de "TabProjet.cpp"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /** L'action a réaliser **/
    void C_Tab_Projet::BDR_Parcourir(QWidget * parent){
        QMessageBox::information(parent, "Test","Ceci est un test!");
    }
    D'avance merci de votre aide!!!

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /*** CE QUE JE VOUDRAIS FAIRE: POURQUOI CA MARCHE PAS????? ***/ 
    //QObject::connect(ui.button_Projet_BDR_Parcourir, SIGNAL(clicked()), Tab_Projet, SLOT(Tab_Projet->BDR_Parcourir(this)));
    Tu devrais lire le message d'erreur affiché sur cerr par Qt quand un connect échoue. Si tu lui donnes ça comme SLOT, il va rechercher la fonctione nommée "Tab_Projet->BDR_Parcourir(this)" te tu es d'accors, c'est pas un nom de fonction ça.
    Remplace par la même déclaration que dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void BDR_Parcourir(QWidget *);
    seulement il va y avoir un problème, car tu connectes un signal sans paramètre (clicked()) à un slot qui en attend un (BDR_Parcourir(QWidget *)). Donc ils sont pas compatibles. Et tu peux pas passer this en paramètre dans SLOT comme tu essaye de le faire, car les SLOT/SIGNAL c'est juste des chaînes de caractères.
    A quoi il te sert ce paramètre QWidget* ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup, vous avez trouvez!!!

    Plus exactement c'est ceci qui m'a aidé
    seulement il va y avoir un problème, car tu connectes un signal sans paramètre (clicked()) à un slot qui en attend un (BDR_Parcourir(QWidget *)). Donc ils sont pas compatibles. Et tu peux pas passer this en paramètre dans SLOT comme tu essaye de le faire, car les SLOT/SIGNAL c'est juste des chaînes de caractères.
    Voici la solution pour les curieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect(ui.button_Projet_BDR_Parcourir, SIGNAL(clicked()), Tab_Projet, SLOT(BDR_Parcourir()));
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void C_Tab_Projet::BDR_Parcourir(){
    QWidget * parent = 0;}
    Encore merci !

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Et il sert çà quoi le paramètre alors ?

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/05/2010, 11h50
  2. Connexion SIGNAL / SLOT (No such signal)
    Par ero-sennin dans le forum Débuter
    Réponses: 1
    Dernier message: 22/10/2009, 15h26

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