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 :

[QGraphicsLineItem]Implémentation des fonctions événementielles virtuelles


Sujet :

Qt

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut [QGraphicsLineItem]Implémentation des fonctions événementielles virtuelles
    Bonjour à tous,

    J'aimerai pouvoir récupérer les événements hoverEnterEvent et hoverLeaveEvent d'un item d'une QGraphicsScene. Ces évènements sont des fonctions virtuelles protégées de la classe QGraphicsItem, il faut donc que je crée une classe dérivée de celle-ci. Le problème c'est que j'aimerai profité des outils fournit par QGraphicsLineItem, mais quand je dérive une classe de QGraphicsLineItem, les événements ne réagissent pas.

    Voici un bout du code :

    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
     
    class MyQGraphicsLineItem : public  QGraphicsLineItem
    {
        public:
            MyQGraphicsLineItem() : QGraphicsLineItem(){};
     
        protected:
            // Ces deux méthodes sont définies plus tard et on pour fonction de changer la position de l'objet (setPos())
            void hoverEnterEvent ( QGraphicsSceneHoverEvent * event );
            void hoverLeaveEvent ( QGraphicsSceneHoverEvent * event );
    };
     
    // Plus loin dans une autre méthode
    MyQGraphicsLineItem *line_item1;
    line_item1 = (MyQGraphicsLineItem*)scene->addLine(QLineF(1,1, 10, 10));
    C'est peut-être le cast qui est mauvais. Quelle serait la solution pour la gestion de ces événements à votre avis ?

    Merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Points : 115
    Points
    115
    Par défaut
    Qu'en est-il du corps de ces méthodes ? Les as-tu implémentés ? Si non, c'est un peu normal ! :p

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 67
    Points : 63
    Points
    63
    Par défaut
    je me demande si ce n'est pas le même problème que:
    http://www.developpez.net/forums/d69...lots-heritage/

    Essaye de rajouter le mot clé "virtual" devant les déclarations de tes évènements...

  4. #4
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Non, le moc n'est pas concerné dans ce problème, donc pas de soucis.

    Par contre, as-tu bien appelé "setAcceptsHoverEvents(true);" sur ton item ? Sans ça ne marche pas, et c'est false par défaut (dans un souci de performance).

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    J'ai essayé avec la fonction setAcceptsHoverEvents(true) mais ça ne change rien. Je pense qu'il y a une erreur au niveau de la création de l'item mais je ne sais pas comment le résoudre.
    Quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    line_item1 = (MyQGraphicsLineItem*)scene->addLine(QLineF(1,1, 10, 10));
    la fonction addLine me renvoi un QGraphicsLineItem et donc je le cast, mais je ne pense pas que ce soit valable. Le problème est que l'on appelle pas explicitement le constructeur du QGraphicsLineItem, comment puis-je faire à votre avis ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 67
    Points : 63
    Points
    63
    Par défaut
    Autre question bête. Est-il normal de ne pas retrouver la macro Q_OBJECT dans la déclaration de la classe?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    J'ai déjà dérivé la classe QGraphicsScene et QGraphicsView avec la même structure et sans la macro QOBJECT, les méthodes événementielles protégés marchent parfaitement.
    Si j'ai bien compris je crois que QOBJECT est nécessaire seulement quand on utilise des slots et signals.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Points : 115
    Points
    115
    Par défaut
    C'est bien celà, mais je crois que justement ta méthode a besoin de signaux... D'où peut-être le problème.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Dans la documentation je n'ai pas réussi à trouver de signaux hover, c'est pour cela que j'ai tenté ces méthodes. Ils en existent ?

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    [QUOTE=black is beautiful;4065942Si j'ai bien compris je crois que QOBJECT est nécessaire seulement quand on utilise des slots et signals.[/QUOTE]
    La grosse majorité oui. Mais elle sert à d'autre chose (meta data, cast Qt, ...). Par principe il est toujours mieux de la mettre.

    Citation Envoyé par barbug Voir le message
    C'est bien celà, mais je crois que justement ta méthode a besoin de signaux... D'où peut-être le problème.
    Je ne pense pas que certain event passe par les signaux


    As tu essayé avec un rectangle?

  11. #11
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    Salut !

    As-tu par hasard ré-implémenté mouseMoveEvent() dans ta QGraphicsScene ou QGraphicsView ? Si c'est le cas, il ne faut pas oublier de rappeler à la fin de ces méthodes l'évènement en question, sans quoi la propagation n'ira jamais jusqu'à l'item, le Hover ne pourra pas fonctionner.

    Tu peux regarder le code en python que j'avais mis sur ce sujet :

    http://www.developpez.net/forums/d66...egment-souris/

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Oui j'avais ré-implémenté c'est méthodes mais je n'ai pas rappelé l'événement. Je vais essayer ça maintenant.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Je ne trouve pas la fonction pour rappeler l'événement
    Quelle est le nom de la méthode ?

  14. #14
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    Tu fais un appel statique à la méthode mouseMoveEvent de QGraphicsScene en lui repassant l'event en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QGraphicsScene::mouseMoveEvent(mouseEvent);

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Je viens de le faire mais ça ne change rien... Mais vous êtes sur que cette ligne est valable ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyQGraphicsLineItem *line_item1;
    line_item1 = (MyQGraphicsLineItem*)scene->addLine(QLineF(x, y, x, y));
    Parce-qu'en C++ est-ce que c'est autorisé ?
    Si dans ma classe MyQGraphicsLineItem je rajoute des données membres et que je fais des accesseurs, quand j'appelle ces accesseurs, le programme plante...

  16. #16
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par black is beautiful Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyQGraphicsLineItem *line_item1;
    line_item1 = (MyQGraphicsLineItem*)scene->addLine(QLineF(x, y, x, y));
    Y'a personne qu'a tilté dessus encore ?!

    Non, ce n'est pas valide du tout ça. Il faut que tu instancies toi même ton line_item1 puis que tu l'ajoutes à la scène, pas le faire par cette fonction de la scène.
    C'est les bases de l'héritage en C++, tu fais un downcast non valide ici. Et accessoirement, tu devrais utiliser dynamic_cast<> au lieu d'un cast C; dès l'utilisation suivante de line_item1, ça aurait crashé puisqu'il aurait été NULL.

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Dans l'ordre, je crée mon objet MyQGraphicsLineItem et ensuite je l'ajoute à ma scène avec la fonction addItem, c'est bien ça ?

  18. #18
    Membre actif
    Avatar de doof
    Inscrit en
    Août 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 160
    Points : 294
    Points
    294
    Par défaut
    Tout à fait ! (comme je faisais dans mon code python d'ailleurs, t'y as jeté un œil ?)

    Cela dit, je reste convaincu que ce que j'ai dit sur la propagation d'évènements reste valable.

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    554
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 554
    Points : 181
    Points
    181
    Par défaut
    Super ça marche enfin
    Merci beaucoup à tous,

    Dernière petite question, est-ce que l'on peut élargir l'event hover car ma souris doit être pile sur le point x,y pour que l'évènement se déclenche...

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 27/01/2013, 15h25
  2. cacher l'implémentation des fonctions inline
    Par PyNub dans le forum Débuter
    Réponses: 27
    Dernier message: 28/08/2012, 19h28
  3. [XQUERY] implémenter des fonctions
    Par fatjoe dans le forum XQUERY/SGBD
    Réponses: 3
    Dernier message: 14/04/2010, 12h57
  4. Classe Java qui implémente des fonctions oracles
    Par kamacho25 dans le forum Outils
    Réponses: 0
    Dernier message: 28/09/2007, 14h46
  5. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19

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