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 :

Problème avec les slots

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 62
    Par défaut Problème avec les slots
    Bonjour,

    J'ai un petit problème pour récupérer certaines valeurs de QLineEdit

    Imaginons que j'ai une classe fenetre simple avec dedans un bouton B et un QLineEdit Q

    j'ai mis un connect sur mon bouton B de la facon suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    connect(B, SIGNAL(clicked()), this, SLOT(fonction(Q.text())));

    le membre fonction devrait juste afficher le QString récupéré dans un QTextBrowser.

    Et voilà, quand je tape quelquechose dans mon QLineEdit, puis que je clic sur mon bouton, il ne se passe rien

    Comprends pas

    N.B. Je sais bien que je pourrai faire une fonction sans arguments et à l'intérieur récupérer le string du QLineEdit. Mais j'aimerais voir pourquoi cela ne marche pas avec les arguments comme cela.

    Merci de me dire d'ou vient le souci

  2. #2
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    La signature d'un signal et d'un slot doit etre identique donc ce que tu fais ne peux pas fonctionner.

    Pour plus de precision merci de lire la FAQ ici.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Voici un exemple de programme ,compilable, qui pourrait t'aider :


    programme.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
     
    #include "taclasslib.h"
    #include <QApplication>
    #include <QPushButton>
    //#include <QGridLayout>
    //#include <QWidget>
     
    int main(int argc,char ** argv)
    {	QApplication app(argc,argv) ;
    	QLineEdit * lignemots = new QLineEdit ;
    	QPushButton * bouton = new QPushButton("Validation") ;
    	Taclasslib objet ;
    	QLabel * label = new QLabel ;
    	objet.initialisation() ;
    	lignemots->show() ;
    	bouton->show() ;
    	label->setFixedSize(400,250) ;
    	label->show() ;
    	objet.ajusteWidgets(lignemots,label) ;
    	QObject::connect(bouton,SIGNAL(clicked()),&objet,SLOT(unefonction()) ) ;
    app.exec() ;
    return 0 ;
    }
    taclasslib.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
    #ifndef _TACLASSLIB_H_
    #define _TACLASSLIB_H_
     
    #include <QLineEdit>
    #include <QLabel>
    #include <QString>
    #include <QObject>
    class Taclasslib : public QObject
    {	Q_OBJECT	
        public :
    	void initialisation()
    	{ m_mots = new QLineEdit ; entier = 0 ; l_label = new QLabel ; }
     
    	void ajusteWidgets(QLineEdit * mots,QLabel * label)
    	{   m_mots = mots ; l_label = label ; }
     
          public slots :
    	void unefonction()
    	{    motqstr = m_mots->text() + "  (" + QString::number(entier) + ") " ; 
    	        l_label->setText(motqstr) ;
    		l_label->update() ;
    	entier++ ;	    
    	}
     
      private :    
      int entier ;
      QLabel * l_label ;
      QLineEdit * m_mots ;  
      QString motqstr ;  
    };
     
    #endif
    ...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 62
    Par défaut
    Ok donc il faut le même nombre d'arguments pour signal et slot. Cela peut etre handicapant, en tout cas, jtrouve que c'est un leak...
    Sur qu'il y a moyen de contourner.

    Merci pour le code

  5. #5
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Tu peux mettre un argument dans ton slot avec une valeur par défaut, du coup le signal sans argument appellera le slot avec la valeur d'argument par défaut. Mais ça ne permet pas d'utiliser une valeur non statique.

    Après dans ton cas je ne trouve pas que récupérer la valeur dans le corps de la fonction soit handicapant, et je n'ai jamais eu besoin de faire ce que tu comptais faire.

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Pour rappel, il n'est pas nécessaire d'avoir exactement le même nombre d'argument. Le slot peut ignorer des arguments qu'il n'a pas besoin. Et c'est exactement le cas avec clicked puisque la signature de clicked est :
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    connect(this, SIGNAL(signal_sans_bool()), this, SLOT(slot_bool(bool))); // erreur
    connect(this, SIGNAL(signal_bool(bool)), this, SLOT(slot_sans_bool())); // OK
    Ok donc il faut le même nombre d'arguments pour signal et slot. Cela peut etre handicapant, en tout cas, jtrouve que c'est un leak...
    Ca dépend du point de vue (comme beaucoup de chose)...

    Dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(B, SIGNAL(clicked()), this, SLOT(fonction(Q.text())));
    Tu voudrais en fait que lorsque tu cliques sur un bouton, ça envoie également le texte contenu dans un autre widget. En terme de conception objet, ça n'est pas du tout naturel et intuitif.

    Un objet qui doit aller chercher les informations dans un autre objet totalement indépendant, c'est une mauvaise approche.
    Un objet qui envoie un signal à un parent qui va chercher des informations dans un autre objet enfant, ça c'est une bonne approche.

    Bref, comme on te l'a dit, il faut un slot sans paramètre qui ira chercher le texte

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

Discussions similaires

  1. [2.x] Problème avec les slot
    Par bihman dans le forum Symfony
    Réponses: 0
    Dernier message: 15/04/2012, 13h56
  2. Problème avec les slots
    Par sebasti1-88 dans le forum Débuter
    Réponses: 5
    Dernier message: 29/06/2011, 22h10
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par Invité dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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