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 avec un signal/slot


Sujet :

Qt

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut Problème avec un signal/slot
    Bonsoir,

    Voila j'ai un petit soucis avec un signal/slot, je voudrais que toutes les 1sec de mon timer il envoi un signal à mon slot qui affiche un message seulement rien ne ce produit et je ne comprend pas pourquoi

    Voici le code du signal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Test::Test()
    {
    	QTimer temps;
     
    	temps.setInterval(1000);
    	temps.setSingleShot(false);
     
    	connect(&temps, SIGNAL(timeout()), this, SLOT(affiche()));
     
    	return;
    }
    Et celui du slot:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void Test::affiche()
    {
    	std::cout << "Coucou";
     
    	return;
    }
    Merci d'avance à ceux qui voudront bien m'aider

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Test::Test()
    {
    	QTimer temps;
     
    	temps.setInterval(1000);
    	temps.setSingleShot(false);
     
    	connect(&temps, SIGNAL(timeout()), this, SLOT(affiche()));
     
    	return;
    }
    a ton avis, quand est détruit temps?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Pour l'instant jamais non ? vu que je ne fais pas de stop :s d'ailleurs j'ai oublié de marquer le start autant pour moi

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par scary Voir le message
    Pour l'instant jamais non ?
    elle est détruite à la sortie de ton créateur
    Il faut soit que te mette tempsen membre de ta classe, soit utiliser un pointeur.

    Citation Envoyé par scary Voir le message
    d'ailleurs j'ai oublié de marquer le start autant pour moi
    ca c'était le bonus :p

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Ah ben justement même en faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Test::Test()
    {
            this->timer.setInterval(1000);
    	this->timer.setSingleShot(false);
     
    	connect(&this->timer, SIGNAL(timeout()), this, SLOT(affiche()));
     
    	return;
    }
    La classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Test : public QObject
    {
    	Q_OBJECT
     
    	private:
    		QTimer  timer;             
     
    	public slots:
    		void affiche();
     
    	public:
    		Test();
    		~Test();
    }
    Sa marche pas

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Il semble qu'il manque le start(), ou alors on nous cache du code .
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Voici tout le code (je pense que cela sera plus facile)

    le .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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include "timer.h"
     
    Test::Test()
    {
        this->temps = 0;
        this->timer.setInterval(1000);
    	this->timer.setSingleShot(false);
     
    	connect(&this->timer, SIGNAL(timeout()), this, SLOT(affiche()));
    	this->timer.start ();
     
    	return;
    }
     
    void Test::affiche()
    {
        if (temps == 10)
        {
            this->timer.stop ();
        }
        else 
        {
            this->temps++;
    	std::cout << "Coucou";
        }
     
    	return;
    }
     
    Test::~Test()
    {
        return;
    }
     
    int main(int argc, char *argv[])
    {
        Test w;
     
        return 0;
    }
    le .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
    #include <QTimer>
    #include <QObject>
    #include <iostream>
     
    class Test : public QObject
    {
        Q_OBJECT
     
        private :
            QTimer  timer;
            int temps;
     
        public :
            Test();
            ~Test();
     
        private slots:
            void Test::affiche();
    };

  8. #8
    Membre expérimenté
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut
    Regarde comment on implémente une application en Qt. Ton main ne doit pas être écrit de cette façon, il te faut utiliser la classe QApplication.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(int argc, char ** argv) {
        QApplication app(argc, argv);
     
        QLabel * label = new QLabel("Bonjour !");
        label->show();
     
        return app.exec();
    }

    Ya d'autres erreurs :

    &this => this

    Dans le .h : void Test::affiche(); => void affiche();

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Pour ce qui est du main je ne pas créer une interface graphique donc le show ne me sert à rien. A la rigueur la Qapplication mais bon...

    Ensuite pour le "this" je ne le creer pas de manière dynamique donc il faut bien que le lui passe une adresse à mon connect. Ou alors j'ai pas compris ce que tu cherchais à me faire comprendre

    Puis pour la fonction affiche oui c'est un petit oublie de ma part avec les c/c.

  10. #10
    Membre expérimenté
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut
    Dans le cas d'une appli console, la même avec QCoreApplication. Tu ne peux pas utiliser les objets et mécanismes Qt sans ceci.

    Doc : http://qt.developpez.com/doc/4.6/qcoreapplication/


    Par définition, l'entité this ne dépend pas de la manière dont l'objet est créé (statique ou dynamique), il s'agit d'un pointeur sur cet objet. &this correspondrait donc à l'adresse de ce pointeur, pas du tout ce que tu souhaite manipuler.

    Doc : http://www.codersource.net/cpp_tutor...s_pointer.html

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Pour ce qui est du main je ne pas créer une interface graphique donc le show ne me sert à rien. A la rigueur la Qapplication mais bon...
    C'est la boucle d'évènements de QApplication qui est chargée d'appeler la fonction liée au timer, c.a.d ici l'affichage. Si tu n'as pas de QApplication et que tu n'appelles pas QApplication::exec(), le main() instancie ta classe mais quitte immédiatement après, et ton programme se termine avant d'avoir pu afficher quoi que ce soit. C'est le problème principal dans le code que tu as posté.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    C'est bon j'ai trouvé, il suffisait juste d'ajouter "<<std::endl" à la fin de ma chaine de caractere, c'était en fait tout bête et en effet rajouter QCoreApplication.

    Et pour le this, il faut bien que je lui envoi l'adresse de mon attribut pour qu'il puisse le manipuler, je me réfère juste à la doc sur les signaux/slots de Qt

    Merci bien pour votre aide

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par scary Voir le message
    Et pour le this, il faut bien que je lui envoi l'adresse de mon attribut pour qu'il puisse le manipuler, je me réfère juste à la doc sur les signaux/slots de Qt
    ton & s'applique bien a timer et non au this. Tu as raison.
    Par contre, dans les fonctions de la classe, le this est totalement inutile pour accéder au membre

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

Discussions similaires

  1. Problème avec le signal SIGCHLD
    Par yaute dans le forum C
    Réponses: 2
    Dernier message: 28/11/2012, 02h28
  2. probléme avec les signal "cliked"
    Par dev-linus dans le forum GTK+ avec C & C++
    Réponses: 14
    Dernier message: 22/03/2012, 22h07
  3. [QtCore] Problème de base signal / slot
    Par Neitsa dans le forum PyQt
    Réponses: 2
    Dernier message: 21/09/2011, 14h29
  4. Problème avec un signal capricieux
    Par Athel dans le forum Qt
    Réponses: 3
    Dernier message: 15/05/2008, 16h53
  5. Problème de connect (signal/slots)
    Par Alain Defrance dans le forum Qt
    Réponses: 5
    Dernier message: 20/03/2008, 21h58

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