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 :

[QGraphicsItem] Propagation Hover Events


Sujet :

Qt

  1. #1
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut [QGraphicsItem] Propagation Hover Events
    Salut,

    J'ai une scene avec differents items superposés (il s'agit du toit d'une maison avec différents items en dessous représentant les différentes pièces ) et j'aimerais que quand on passe la souris sur le toit, le toit disparaisse, et ensuite que chaque pièce se colore au passage de la souris.

    Le toit s'en va bien, par contre mes child items ne recoivent pas les hoverEvent (ils sont tous captés par l'item qui represente le toit).

    Avez vous une solution pour faire ce genre de choses ?

    Merci

    G.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 076
    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 076
    Billets dans le blog
    145
    Par défaut
    Bonjour,

    Je ne suis plus sur, mais je croit qu'il y a une méthode ( fontion ? ) pour dire à Qt de continuer à faire passer l'event.

    Sinon, dans la fonction qui capte l'event, il n'y a qu'a appeler une fonction pour les pièces ... ( mais on perd un peu en efficacité )
    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.

  3. #3
    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
    Tu fait comment pour cacher ton toit?
    hide()? alpha = 0?

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Dans le pire des cas, tu peux réimplémenter mouseMoveEvent.

    Mais sinon, quand on fait event->ignore(), ça transmet effectivement l'évènement au parent si je ne m'abuse.

    void QEvent::accept ()

    Sets the accept flag of the event object, the equivalent of calling setAccepted(true).

    Setting the accept parameter indicates that the event receiver wants the event. Unwanted events might be propagated to the parent widget.

    -------------------

    void QEvent::ignore ()

    Clears the accept flag parameter of the event object, the equivalent of calling setAccepted(false).

    Clearing the accept parameter indicates that the event receiver does not want the event. Unwanted events might be propgated to the parent widget.

    See also accept().

    Une petite astuce dans ton cas serait de déplacer ton toit à la position (20000, 0) par exemple, le temps où la souris est sur lui. Dès que les "pièces" de la maison n'ont plus la souris pointées sur elles, tu ramènes le toit.

    C'est un peu "moche" mais ça peut marcher

  5. #5
    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 Alp Voir le message
    Une petite astuce dans ton cas serait de déplacer ton toit à la position (20000, 0) par exemple, le temps où la souris est sur lui. Dès que les "pièces" de la maison n'ont plus la souris pointées sur elles, tu ramènes le toit.

    C'est un peu "moche" mais ça peut marcher
    Normalement le hide() permet d'enlever temporairement un item. Et fait cela.
    J'ai constaté que si un alpha =0, l'item est toujours ici et capte les événements.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    En fait, je fais pas de hide() sur l'item principal, mais plutot un show sur les items du dessous (qui sont cachés par defaut).

    J'ai essayé avec les accept() / ignore(), et aussi les handleChildEvents(), mais sans succès. Je n'ai pas eu vraiment le temps d'insister pour être franc, j'espère avoir plus de temps en fin de journée.

    G.

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut
    Le problème de accept et ignore c'est que la relation de parenté qui dépend de la modélisation ne correspondra pas forcément avec la vue de l'application.

    Trouver une solution avec hide() parait plus propre.

    Tes éléments sous le toit possèdent bien les fonctions nécessaire pour capter les event souris? As tu fait un test sans toit?

    Si tu ne fais pas de hide et que tes éléments sont sous le toit, il est normal que tu ne puisse pas cliquer dessus. Tentes un raise sur les items apres le show.

  8. #8
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Un hide() sur le toit puis une surcharge de mouseMoveEvent(QMouseEvent* e) qui modifie la couleur de fond (de sorte à ce que ce soit cette dernière qui soit affichée lors du painting de ta QGraphicsView) et ça ira non ?

    Faut juste surveiller que la souris soit bien dessus. Dès qu'une des pièces voit que la souris est sur elle, il faudrait éventuellement qu'elle le dise aux autres, pour être sûr que ça sera la seule à être mise en évidence.

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    J'essaierai tout ça, merci pour votre aide.

    Tes éléments sous le toit possèdent bien les fonctions nécessaire pour capter les event souris? As tu fait un test sans toit?
    Oui j'ai testé et ça marche.

    Un hide() sur le toit puis une surcharge de mouseMoveEvent(QMouseEvent* e) qui modifie la couleur de fond (de sorte à ce que ce soit cette dernière qui soit affichée lors du painting de ta QGraphicsView) et ça ira non ?
    Le problème du hide() c'est que mes images sont en perspective, et le toit n'est pas en fait qu'un toit mais un pixmap qui représente d'autres choses sur les côtés. Pour utiliser le hide() il faudrait que je fasse un graphicsitem qui couvrent juste la zone des parties inférieures, mais sa forme est assez complexe. Le fait de plutot faire un show sur les items inférieurs m'évitait cela.

    Enfin bon, j'essaierai cet après midi.

    Merci encore,

    G.

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Par défaut
    Et un raise() pour faire passer tes items au dessus du toit ne ferait pas l'affaire?

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Bon c'est bon ça marche, sans rien de particulier. J'ai conservé le show() de mes sous-items lors du hover du parent, j'ai desactivé le handleChildEvent, et ça à l'air de marcher. J'ai tout repris depuis le début et ça marche.

    J'ai aussi redéfini le mousePressEvent des items, et en lisant la doc, j'ai vu
    The mouse press event decides which item should become the mouse grabber (see QGraphicsScene::mouseGrabberItem()). If you do not reimplement this function, the press event will propagate to any topmost item beneath this item, and no other mouse events will be delivered to this item.
    Je ne suis pas sûr que ça ait quelque chose à voir avec le problème, car les hoverEvents ne sont pas des mouseEvent (même si je pense qu'ils soient liés).

    Merci encore,

    G.

Discussions similaires

  1. Concept propagation et bubbling event
    Par Ali Kent dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 16/12/2014, 16h22
  2. [Flex4] Propagation Event TitleWindow
    Par Flamenco dans le forum Flex
    Réponses: 6
    Dernier message: 12/10/2011, 14h31
  3. Réponses: 4
    Dernier message: 20/10/2009, 18h34
  4. propagation événement avec dispatch event
    Par john123 dans le forum Flex
    Réponses: 3
    Dernier message: 19/02/2009, 13h25
  5. Propagation Event sur le Parent
    Par Moustico dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/09/2008, 15h40

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