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 :

Gestion des événements

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Gestion des événements
    Bonjour,
    C'est à propos de la compréhension de la doc au sujet de la gestion des évènements : j'ai compris ceci :
    => il y a mon programme et un gestionnaire d'évènements
    => mon programme envoie ceci au gestionnaire d'évènements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qApp->postEvent(ton_widget, new QMouseEvent(QEvent::MouseButtonDblClick, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
    => et ensuite le gestionnaire d'évènements traque mon programme qui contient ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void doubleclick(QMouseEvent *qevent)
        {
            <instructions>
        }
    Dès que je clique le gestionnaire "bippe" et le tour est joué ?

    Merci bonne journée. Cordialement, Gizmo.

  2. #2
    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
    Bonjour

    Une petite erreur dans mon code, il manque 1 paramètre (le QPoint) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qApp->postEvent(ton_widget, new QMouseEvent(QEvent::MouseButtonDblClick, QPoint(0,0), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
    le gestionnaire d'évènements traque mon programme qui contient ces lignes :
    Le gestionnaire d'évènements ne regarde pas ton code
    Il appelle la fonction QObject::event de l'objet passé en paramètre (ici ton_widget). Cette fonction vérifie le type d'event (donc ici un QEvent::MouseButtonDblClick) et appelle la fonction correspondante à l'event (donc ici virtual void mouseDoubleClickEvent(QMouseEvent*) et non void doubleclick(QMouseEvent*) comme tu l'as écrit).
    A ce moment, 2 possiblités :
    - tu as réécris cette fonction : la fonction est exécutée et l'event est noté en accept() et ça s'arrête.
    - tu n'as pas réécris cette fonction : l'event est noté en ignore() et est transmit à l'objet parent ; le cycle reprend (event() puis mouseDoubleClickEvent(), etc.) jusqu'à ce qu'un objet accept() ou qu'il n'y ait plus de parent.


    Pour te donner un petit code à tester pour bien comprendre :
    Code mywidget.h : 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
    #ifndef MYWIDGET_H
    #define MYWIDGET_H
     
    #include <QtGui>
     
    class MyWidget : public QLabel
    {
        Q_OBJECT
    public:
        MyWidget(QWidget* parent = 0) :
            QLabel(parent), click(0)
        {
            setText("Aucun clic");
        }
    protected:
        virtual void mouseDoubleClickEvent(QMouseEvent*)
        {
            setText(QString("Il y a eu %1 clics").arg(++click));
        }
    private:
        int click;
    };
     
    #endif // MYWIDGET_H

    Code main.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "mywidget.h"
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MyWidget w;
        w.show();
     
        qApp->postEvent(&w, new QMouseEvent(QEvent::MouseButtonDblClick, QPoint(0,0), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
        qApp->postEvent(&w, new QMouseEvent(QEvent::MouseButtonDblClick, QPoint(0,0), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier));
     
        return a.exec();
    }

    Je pense qu'avec les explications plus détaillées et le code d'exemple, tu devrais bien comprendre.
    Bon courage

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je relirai tout cela plusieurs fois (c'est ma manière à moi de faire) pour mieux comprendre. La compréhension de la gestion des évènements n'est pas si évidente de prime abord.
    Cela mérite de s'y pencher.

    Merci beaucoup pour toutes ces explications. Ca doit être assez jubilatoire d'utiliser cela une fois qu'on en a compris le principe.
    Par contre je ne savais pas qu'on pouvait réécrire une fonction de même nom dans une classe différente.

    Bonne journée. Cordialement, Gizmo.
    Dernière modification par Invité ; 21/07/2011 à 12h49.

  4. #4
    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
    Par contre je ne savais pas qu'on pouvait réécrire une fonction de même nom dans une classe différente.
    sans cela, le mot clé virtual en C++ n'aurait aucun intérêt... puisque l'on ne peut surcharger les fonctions que si elles ont la même signature (nom de fonction + paramètres d'entrée + const). Sinon, on ne fait que créer une nouvelle fonction, sans lien avec la fonction de la classe parent.

    En plus de lire la FAQ sur public, private, protected, tu as gagné le droit de lire la FAQ sur virtual

    Ce sont des notions importantes puisqu'elles concernent la programmation objet en général et ne sont pas spécifique au C++. Donc maîtriser ces concepts te permettra de pouvoir apprendre facilement (dans le futur) d'autres langages objet (en plus de gagner en temps et en qualité de ton code C++)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Qu'est que je gagne au bout ? J'espère des millions

    J'ai testé le code : ce que je trouve d'étrange c'est que quand je désactive les lignes qApp d'envoi de l'évènement "double-clic" au gestionnaire cela marche quand même.
    Mieux : quand je les réactive et que je lance l'exe il affiche d'office 2 double-clic alors que je n'ai cliqué sur rien.

    D'accord je crois avoir compris que écrire qApp dans le main envoie au gestionnaire l'information "double-clic" et le gestion appelle la fonction mouseDoubleClickEvent()
    Mais alors si je veux que mon programme réagisse uniquement au double-clic, la ligne avec qApp est inutile ?...

  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
    Oui, je n'ai pas donné beaucoup d'explication de mon code.
    Les 2 lignes contenant le postEvent sont optionnelles. Elles permettent de simuler 2 events de double clics dans le widget. Donc sans ces fonctions, le compteur est à 0 au démarrage de l'application (il n'y a pas encore eu de double clic), et avec ces fonctions, c'est comme si y a eu 2 double clics au démarrage (et le compteur affiche 2).
    Mais toute la gestion des double clics est faite uniquement par la fonction mouseDoubleClickEvent.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ok en tout cas j'ai compris l'important du mot clé virtual : on peut réécrire entièrement le code de la fonction condition que cette fonction ait la même appellation et le même prototype.
    J'ai eu beau lire la session virtual faq c++, je ne l'avais pas vu sous cet angle-là.
    Finalement je pense que vais sous-classer on verra bien ce que ça donne... De toute façon pour l'instant je ne vois que ça... (je sais je ne pense pas encore en 3 dimensions mais ça va venir...)
    Merci en tout cas.

    Bonne journée. Cordialement, Gizmo.

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

Discussions similaires

  1. [XML] [EXPAT] xml_parse et la gestion des événements...
    Par Herode dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 05/02/2006, 20h59
  2. Gestion des évènements Netscape 7.0
    Par RATHQUEBER dans le forum Autres langages pour le Web
    Réponses: 6
    Dernier message: 19/12/2005, 16h26
  3. Problème avec la gestion des événements
    Par CynO dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 10h07
  4. [JTable] gestion des événements
    Par soulhouf dans le forum Composants
    Réponses: 4
    Dernier message: 19/08/2005, 13h21
  5. Gestion des évènements lors d'un clique sur une image.
    Par yoghisan dans le forum Débuter
    Réponses: 7
    Dernier message: 23/06/2005, 19h04

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