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

  1. #1
    Membre extrêmement actif
    Homme Profil pro
    Graphic Programmer
    Inscrit en
    Mars 2006
    Messages
    1 592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Graphic Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 592
    Points : 4 087
    Points
    4 087
    Par défaut Comment faire réagir les widget à la souris alors qu'elle est occupée avec une opération (clic/déplacement) ?
    Bonjour,

    je fait une application ( simulink like ).

    Mon but est de connecter des boites entre elles via des liens.

    j'ai une boite A qui doit être connecté à une boite B.

    sur la boite A j'ai un bouton qui correspond a une sortie.
    sur la boite B j'ai un bouton qui correspond a une entrée.

    Comme vous le savez, quand la souris se déplace alors qu'un des boutons de la souris est appuyé, elle ne réagit plus avec les autres widget.

    Et la est le problème, pour ce que je veut faire.

    Je voudrait que lorsque, j’appuie sur le bouton de la boite A celui ci reste appuyé ( facile c'est le fonctionnement par default), mais j'aimerais que quand j'arrive sur le bouton de la boite B ( avec mon bouton appuyé ) que celui ci répondent aux événements.

    Par répondre aux événements j'entends qu'il soit redessiné ( mouse hover ) et que je puisse au passage lancer une fontion pour vérifier que les types soit compatible dans le but de confirmer la création du lien.

    J'ai mit une photo en copie, ou on peut voir ce que j'ai évoqué au dessus.
    En espérant que ce soit clair.

    j'ai testé << setMouseTracking(true) >>, mais aperrement qu'il soit true ou false cela ne change rien.
    Images attachées Images attachées  

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    Graphic Programmer
    Inscrit en
    Mars 2006
    Messages
    1 592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Graphic Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 592
    Points : 4 087
    Points
    4 087
    Par défaut
    Bon sinon,

    actuellement les evenements de la souris sont propagés du bouton au QGraphicsItem puis vers la QGraphicscene.

    N'y a t'il pas un moyen de propager les événements de la sourie de la QGraphicsScene au autres QGraphicsItem ( seulement l'hors d'un mousemove sur la scene ) ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Points : 60
    Points
    60
    Par défaut
    installer un eventFilter sur l'élément où tu souhaite recevoir les evènements

    http://doc.qt.nokia.com/latest/event...#event-filters

    il te suffira de créer la méthode eventFilter(....) la ou tu souhaite traiter les évènements et de faire installEventFilter sur les objets qui enverrons les evenememnts...

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    Graphic Programmer
    Inscrit en
    Mars 2006
    Messages
    1 592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Graphic Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 592
    Points : 4 087
    Points
    4 087
    Par défaut
    Salut, merci pour ta réponse.

    J'avais déjà essayé.

    Quand je bouge la souris sans boutons appuyé, ça fonctionne l'eventfilter est bien appelé, par contre des que je bouge la souris avec un bouton appuyé, la fonction est ignoré pour ce widget comme tout les autres widget à part le widget qui a déclenché l’évent.

    A bien y regarder ( sur le web ), d'autres que moi ont ce problème, mais je n'en ai pas trouvé un seul qui a une solution.

    C'est vraiment embêtant.

    J'ai essayé de lancer un qApp->ProcessEvents() pendant le déplacement de la souris mais ça n'y fait rien.

    Pareil le setMouseTracking(true) qui est censé permettre au widget de récup la souris en permanence avec ou sans focus, ne change rien non plus.

    Donc je sèche...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Points : 60
    Points
    60
    Par défaut
    Est ce que ton widget que tu dois déplacer implémente mouseMoveEvent ?

    si oui deux choix d'implémentation son possible... :

    1/ n'accepte pas l'évènement ainsi il sera propagé.
    2/ retire la méthode et execute le placement par le conteneur

    à toi de choisir celle qui te convient le mieux

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    Graphic Programmer
    Inscrit en
    Mars 2006
    Messages
    1 592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Graphic Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 592
    Points : 4 087
    Points
    4 087
    Par défaut
    1) oui propagé du widget vers son parent ( conteneur ) c'est déjà le cas.
    2) et je me sert du conteneur pour positionner le lien.

    Si j’ai bien comprit ce que tu m’explique, c'est pas ce que je demande.

    Pour expliquer un peu plus mon cas,

    Quand je clic sur un des widget qui sont au dessus de ma scène, le widget déclenche l'event mousePressEvent ce qui me permet de garder dans une variable la coordonnée actuelle de la souris et j’envoie un message à la scène pour lui dire que je veux dessiner un lien.

    Ensuite quand je déplace la souris, c'est la scène qui déclenche l'event mouseMoveEvent ce qui me permet de dessiner une ligne a partir du point précédemment sauvegardé, jusqu’à la position actuelle de la souris.

    Puis quand je relâche le bouton de la souris, malheureusement c'est la scène qui capte l’évent ( par malheureusement je veux dire, que c'est le seul hormis l'instance de l'item qui a déclenché l'event, qui me permet de récupérer d'autres évents ) et qui fait en sorte de vérifier la présence d'un item à cette position et de créer le QGraphicsLineItem.

    Quand je déplace la souris je voudrais que quand j'arrive au dessus d'un widget qui a un bouton, j'aimerais que le bouton réagisse comme dans un état normal, cad qu'il déclenche le dessin du bouton et même qu'il déclenche l’évent mouseReleaseEvent, ou je pourrais finir mon travail comme je veux.

    les items qui sont sur ma scène sont tous des instance d'une même classe.
    les boutons y comprit.

    En recherchant dans la doc, je vois uniquement la propagation des event, des widgets enfant vers les widgets parent, mais pas de moyen de propager dans certain cas des évent, du widget parent au widget enfant. Car ça me permettrait éventuellement via le traitement de l’évent mouseReleaseEvent de la scène de renvoyer l’évent vers un widget qui se trouve au dessus de la position courante de la souris.

    En espérant être plus clair, c'est pas évident à expliquer.

    ----

    Donc le problème pour moi vient de la gestion de la souris sous QT.

    Quand je déplace la souris avec un des bouton appuyé, aucun événement n’est récupéré par les item qui sont sur son chemin hormis l'item déclencheur et ses parents.

    On peut faire l’expérience sur n’importe qu'elle application QT, tu clicke sur un bouton, tu garde le bouton de la souris appuyé et tu déplace la souris, tu verra aucun autre bouton réagir ( ne serait que par le mouse hover en redessinant le bouton )

    ----

    En fait en y réfléchissant c'est comme ci le thread principal qui s'occupe de la gestion de l'ui devenait exclusif sur le widget déclencheur et ses parent, et ne s'occupait plus du tout du reste de l'interface.

    Il doit bien y avoir un moyen de lui indiquer une liste de widgets avec les quels il faut garder contact...

    ----

    j'ai aussi testé un système qui consiste à envoyer un signal pendant le déplacement de la souris vers le widget que je veux voir réagir.
    Même problème, le signal est bien reçu par le slot correspondant, l’appel de update est lancé, mais rien n'est graphiquement mit à jour ( en tout cas jusqu’à que je relâche le bouton de la souris ).

    Il faut croire que la souris bloque les events des autres contrôle.

    Y a t'il un moyen de redéfinir le gestionnaire de la souris ?
    ( je vais aller voir les sources je comprendrai peut être comment la souris fonctionne sous QT )

    ----

    je vient de tester un autre truc :

    J'ai envoyé un event sur mesure pendant le deplacement de la souris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QMouseEvent event(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
    QApplication::sendEvent(btn, &event);
    Résultat mon autre widget récupère bien cet événement.
    Donc j'ai essayé avec PaintEvent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QPaintEvent event(QRect(0,0,500,500)); // je suis sur que la zone englobe mon bouton
    QApplication::sendEvent(btn, &event);
    Et malheureusement, échec, le bouton n’est pas repeint.
    Donc la souris doit bloquer les évent de type PaintEvent.

Discussions similaires

  1. Comment faire déconnecter les utilisateurs d'une base
    Par ENIT-Info dans le forum Access
    Réponses: 23
    Dernier message: 28/02/2017, 14h57
  2. Réponses: 0
    Dernier message: 08/11/2010, 12h57
  3. Réponses: 10
    Dernier message: 13/05/2008, 14h08
  4. [MySQL] comment faire sans les vues ?
    Par phpaide dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/04/2006, 13h32
  5. [VBA-W]Comment faire suivre les macros d'un modèle?
    Par gusrom86 dans le forum VBA Word
    Réponses: 7
    Dernier message: 23/02/2006, 10h26

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