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 :

Connexion à un minuteur

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Connexion à un minuteur
    Bonjour, j'ai un petit problème avec mon timer. J'ai l'erreur C2660: 'connect'ÿ: la fonction ne prends pas 4 arguments J'aimerai que ma fonction enlever1fois s'exécute toute les 3 secondes.

    Voici mon .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
     
    int noeuxpapillon::d_nbr=0;
     
    void noeuxpapillon::enlever1fois(QGraphicsScene *w)
    {
     
        d_queue = d_queue->d_precedent;
        w->removeItem(d_queue->d_suivant);
        d_queue->d_suivant = 0;
        d_nbr--;
     
    }
     
    void noeuxpapillon::enlever(QGraphicsScene *w)
    {
        QTimer *timer1 = new QTimer();
        connect(timer1, SIGNAL(timeout()),this, SLOT(enlever1fois(w)));
        while (d_nbr>=0)
        {
        timer1->start(3000);
        }
     
    }
    et mon .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
    33
    34
    35
    36
     
    #ifndef NOEUXPAPILLON_H
    #define NOEUXPAPILLON_H
    #include <QLabel>
    #include <QGraphicsView>
    #include <QPixmap>
    #include <QGraphicsScene>
    #include <QRect>
    #include <QGraphicsItem>
     
     
    class noeuxpapillon: public QGraphicsPixmapItem
    {
    public:
        noeuxpapillon();
        ~noeuxpapillon();
        noeuxpapillon (QGraphicsScene *w);
        void ajouter (QGraphicsScene *w, int view_width, int view_height);
        void enlever (QGraphicsScene *w);
        static int d_nbr;
        static const int max_elt=3;
        noeuxpapillon * d_tete;
        noeuxpapillon * d_queue;
        static bool perdu;
     
    public slots:
        void enlever1fois (QGraphicsScene *w);
     
    private:
     
        noeuxpapillon * d_suivant;
        noeuxpapillon * d_precedent;
     
    };
     
    #endif // NOEUXPAPILLON_H
    Merci d'avance ^^

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

    Pour commencer un QTimer ne s'utilise pas de la sorte de façon bloquante avec une boucle while (qui ici va le faire stopper/re-démarrer sans cesse) : on fixe un certain délai, connecte un slot à exécuter à chaque "timeout", et démarre le timer. Celui-ci se chargera alors tout seul d'émettre à chaque intervalle fixé son signal timeout() qui entrainera l'exécution du slot.
    Remplace donc ta boucle while par un simple timer1->start(3000);. Et lorsque ton d_nbr arrivera à 0, stop() ton timer dans la méthode enlever1fois() (passe-le en membre de la classe pour pouvoir ce faire).
    Et n'oublie pas de le libérer, ou de profiter du mécanisme de Qt pour cela

    Ensuite, le passage de la variable w. Il n'est pas possible de faire passer de la sorte des arguments sur la ligne du connect. On ne fait que spécifier les types des différents paramètres des signaux/slots. Et le signal timeout() n'en ayant ici aucun, le slot se doit aussi de n'en avoir aucun (nombre inférieur ou égal de paramètres).
    Si tu utilises Qt5 et C++11, tu peux utiliser une lambda :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(timer1, &QTimer::timeout, [w,this]() { enlever1fois(w); } );
    Afin de pouvoir utiliser les signaux/slots dans une classe, celle-ci doit hériter de QObject, et avoir la macro Q_OBJECT (cf. FAQ), ce qui n'est pas le cas de ta classe
    noeuxpapillon (QGraphicsPixmapItem n'hérite pas de QObject).

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Donc, dans un premier temps, il faudrait que je fasse hériter ma classe noeuxpapillon de QLabel au lieu de QGraphicsPixmapItem afin de pouvoir utiliser les slots/signaux?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Pourquoi vouloir utiliser un QLabel au lieu de ton QGraphicsPixmapItem actuel ?
    Si c'est pour hériter de QObject, tu peux très bien utiliser l'héritage multiple (attention de mettre QObject en premier):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class noeuxpapillon: public QObject, public QGraphicsPixmapItem { ... };
    À noter que l'on préfère mettre des majuscules aux mots composant le nom d'une classe : NoeuxPapillon.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    J'ai fait quelques modifications. J'ai fait hérité ma classe de QObject et QGraphicsPixmapItem (merci pour l'astuce du double héritage ^^), j'ai aussi modifié ma fonction enlever grâce à tes conseils, mais maintenant le programme plante quand on arrive à d_nbr=0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void noeuxpapillon::enlever(QGraphicsScene *w)
    {
     
            QTimer *timer1 = new QTimer();
            connect(timer1, &QTimer::timeout, [w,this]() { enlever1fois(w); } );
            timer1->start(3000);
            if (d_nbr==0)
            {
                perdu=true;
                timer1->stop();
            }
     
    }

  6. #6
    Invité
    Invité(e)
    Par défaut
    J'ai bien dit dans ta méthode enlever1fois()
    Citation Envoyé par Winjerome
    Et lorsque ton d_nbr arrivera à 0, stop() ton timer dans la méthode enlever1fois() (passe-le en membre de la classe pour pouvoir ce faire).
    Là tu vérifies tout de suite après avoir lancé ton timer. d_nbr n'est donc pas encore égal à 0. La méthode enlever1fois() est alors appelée indéfiniment jusqu'à ce que l'on ai plus d'élément suivant, ce qui provoque un plantage.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Ok, j'ai modifié enlever() et enlever1fois(), mais maintenant j'ai l'erreur "impossible de capturer implicitement 'timer1' car aucun mode de capture par défaut n'a été spécifié."

    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
     
    void noeuxpapillon::enlever1fois(QGraphicsScene *w, QTimer *timer1)
    {
     
     
        d_queue = d_queue->d_precedent;
        w->removeItem(d_queue->d_suivant);
        d_queue->d_suivant = 0;
        d_nbr--;
        if (d_nbr==0)
        {
            perdu=true;
            timer1->stop();
        }
     
    }
     
    void noeuxpapillon::enlever(QGraphicsScene *w)
    {
     
            QTimer *timer1 = new QTimer();
            connect(timer1, &QTimer::timeout, [w,this]() { enlever1fois(w,timer1); } );
            timer1->start(3000);
     
     
    }

Discussions similaires

  1. [Kylix] [cgi] pb déploiement appli avec connexion MySQL [rés
    Par Nepomiachty Olivier dans le forum EDI
    Réponses: 3
    Dernier message: 06/08/2002, 20h09
  2. [CR 8.5][Web] demande de connexion récurrente.
    Par Edison dans le forum Connectivité
    Réponses: 4
    Dernier message: 09/07/2002, 17h48
  3. Réponses: 4
    Dernier message: 04/07/2002, 12h31
  4. Connexion ODBC
    Par Anonymous dans le forum Réseau
    Réponses: 2
    Dernier message: 23/04/2002, 12h10
  5. Je ne peux établir une connexion cliente sous Linux.
    Par Anonymous dans le forum CORBA
    Réponses: 5
    Dernier message: 16/04/2002, 15h57

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