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 :

Récupérer <<position Souris>> d'un QGraphicsScene [Graphics View]


Sujet :

Qt

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 88
    Par défaut Récupérer <<position Souris>> d'un QGraphicsScene
    Bonjour à tous,
    Depuis quelques temps je sèche sur un truc
    En faite j'aimerais récupérer la position des pixels , d'une image qui se trouve dans la scene (QGraphicsScene) , et cela en bougeant tout simplement la souris .Sans maintenir le bouton appuyer.
    Le problème ce que QGraphicsScene ne dispose pas de l'option setMouseTracking !!
    Vous sauriez une méthode qui peut détourné ça !
    Remarque Avec la méthode mouseMoveEvent(QGraphicsSceneMouseEvent *qevent) ça marche trés bien , sauf que je dois maintenir le bouton enfoncé .
    Merci d'avance

  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

    Je n'ai pas essayé, mais il est indiqué dans la doc de QMouseEvent (http://qt.developpez.com/doc/latest/...t.html#details) que le suivis de la souris n'est actif (par défaut) que lorsque l'on clique avec la souris :
    Mouse move events will occur only when a mouse button is pressed down, unless mouse tracking has been enabled with QWidget::setMouseTracking().
    Pour activer le suivis sans clique, il faut mettre la propriété mouseTracking à true(http://qt.developpez.com/doc/latest/...etracking-prop)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setMouseTracking(true);
    EDIT: Attention, QGraphicsScene n'est pas un objet "graphique" (il dérive de QObject et prend en charge la gestion des objets graphiques). C'est QGraphicsView qui récupère le suivis de la souris

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 88
    Par défaut
    Merci de m'avoir répondu .
    Oui ce que tu dis n'est pas faux.
    Mais dans mon cas mon image est sur une classe QGraphicsScene , qui n'hérite pas de Widget .Donc pas possible d'activer le setMouseTracking
    En plus elle utilise QGraphicsSceneMouseEvent et non pas QMouseEvent

  4. #4
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Par défaut
    Citation Envoyé par doukha Voir le message
    Merci de m'avoir répondu .
    Oui ce que tu dis n'est pas faux.
    Mais dans mon cas mon image est sur une classe QGraphicsScene , qui n'hérite pas de Widget .Donc pas possible d'activer le setMouseTracking
    En plus elle utilise QGraphicsSceneMouseEvent et non pas QMouseEvent
    Il suffit que tu mettes ta QGraphicsScene dans une QGraphicsView et tu récupére ton event comme ça. C'est fait pour ça :

    The QGraphicsView class provides a widget for displaying the contents of a QGraphicsScene.
    Constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QGraphicsView  ( QGraphicsScene * scene, QWidget * parent = 0 )

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 88
    Par défaut
    Bien entendu ma scène est situé dans dans QGraphicsView!
    Mais je voulais éviter de passer par le qGraphicsView de peur qu'il me donne pas les bon coordonnées de mon image, que je rappelle est affichée par la scène.
    ai-je tort ?

  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
    A priori, oui

    Le système Graphics View de Qt est basé sur le pattern MVC (Model-View-Control) qui sépare la gestion des données et affichage (http://qt.developpez.com/doc/4.7/vue...-graphics-view) :
    - QGraphicsScene : gère les objets QGraphicsItem
    - QGraphicsView : s'occupe de l'affichage de la scène et des items
    C'est donc bien la vue qui est visible et qui interagit avec l'utilisateur (et non la vue qui est affichée par la scène) et qui récupère les événement souris

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 88
    Par défaut
    Thanks a lot pour tout les deux
    Donc, oui la solution est de passer par QgraphicsView.
    Mais bon je m'en aperçois aussi que le QMouseEvent ça prend le dessus sur le QGraphicsSceneMouseEvent , en d'autres termes les
    mouse[Release,Move,Press]Event(QGraphicsSceneMouseEvent *mouseEvent) ne marchent plus
    Auriez vous une astuce qui peut remédier à ça ?

  8. #8
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Par défaut
    Citation Envoyé par doukha Voir le message
    Auriez vous une astuce qui peut remédier à ça ?
    Comme l'a dit gbdivers, sépare bien l'affichage de ton image avec QGraphicsScene et la gestion des évènements utilisateurs (toutes les events) avec le QGraphicsView. Il y a surement un peu de refactoring à faire dans ton code mais ce sera plus propre

  9. #9
    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
    La doc explique le cheminement des event (http://qt.developpez.com/doc/4.7/qgr...tion-detaillee) :
    When a QGraphicsView receives a QMouseEvent, it translates it to a QGraphicsSceneMouseEvent. The event is then forwarded to the QGraphicsScene associated with the view. If the event is not handled by the scene, the view may use it, e.g., for the DragMode.
    La vue (QGraphicsView, chargé de l'UI) reçoit l'event (QMouseEvent) et transmet un nouvel event (QGraphicsSceneMouseEvent) à la scène (QGraphicsScene, le modèle/controleur dans le modèle MVC).

    Donc pour ton problème, tu dois :
    - activer la récupération des déplacements de la souris dans la vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    view.setMouseTracking(true);
    - Si le mouvement de souris interagit avec les items, tu transmets à la scène pour quelle modifie en conséquence les items, avec pos(), scenePos() ou screenPos()
    - si le mouvement de la scène n'interagit pas avec les items (par exemple pour afficher une ligne entre un point d'origine et la position actuelle de la souris) tu gères directement dans la vue.

  10. #10
    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
    c'est ca que tu cherche?
    http://qt.developpez.com/doc/latest/...tml#maptoscene
    ça transforme la coordonné de la view en coordonnée de la scène.

  11. #11
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 88
    Par défaut
    Non pour répondre à YAN. parce que moi je dessin avec les évènements de QGraphicsScene .

    Bon voilà mon code pour expliciter tout ça :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    //Mon QGraphicsScene : il interpèle le mouvement de la souris pour dessiner
    //MousePress
    void imageNaff::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
    {
      mouseEvent->accept(); //j'accepte l'evenement
      if (mouseEvent->button() != Qt::LeftButton)
      return;
      switch (myMode) {
          case rect:
    	  rectangle = new QGraphicsRectItem(QRectF(mouseEvent->scenePos(),
    									mouseEvent->scenePos()));
    	 rectangle->setPen(QPen(Qt::SquareCap));
    	 addItem(rectangle);
             break;
    case nothing :
    	  return;
    	  default:
         ;
     }
     
    //MouseMoveEvent
    void imageNaff::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
    {
    	mouseEvent->accept();
    	if (myMode == rect && rectangle != 0)
    	{
    		mouseEvent->setAccepted(true);
    		newRect(rectangle->rect().topLeft(),mouseEvent->scenePos());
    		QRectF newRect(rectangle->rect().topLeft(),mouseEvent->scenePos());
    		rectangle->setRect(newRect);
    	}
    	if (myMode == nothing) {
    		return;
    	}
    }
    //MouseRelease
    void imageNaff::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) 
    {
    	mouseEvent->accept();//j'accepte l'évènement propagé
    	if (myMode == rect ) 
    	{
    		myMode = nothing;
    		//JE récupère les  pixel qui se trouve dans le rect de rectangle
    		pixelsInRect(rectangle);
    	}
    	if (myMode == nothing ) 
    	{ return ; }
    }
    Le code marche bien croyez moi !
    mais alors si j'ajoute à mon GRaphicsView les interpellation de mouvement de la souris(voir code d'en bas) .Il prend le dessus .c'est à dire qu'il va bien m'afficher les coordonnées de la scene lorsque je passe la souris dessus .MAis l'evenement n'est pas propagé ,ou du moins , pas capter par QGraphicsScene pour dessiner .
    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
     
    //Le QGraphicsView va interpeller la position de la souris pour seulement l'afficher.
    //bien sur, sous entendu , que le setMouseTracking est à TRUE.
    void viewNaff::mouseMoveEvent(QMouseEvent *mouseEvent)
    {
     
    	*pos = mouseEvent->pos();
    	if( (pos->x() >= 0)  && (pos->y() >= 0) )
    		{
    		QString posStr = "x: ";
    		posStr.append(QString::number(pos->x()));
    		posStr.append("| y: ");
    		posStr.append(QString::number(pos->y()));
    		affichageXY->setText(posStr);
    		update();
    	}
    	QGraphicsView::mousePressEvent(mouseEvent); //pour propager l'evenement à la scène
    }
     
    void viewNaff::mousePressEvent(QMouseEvent *mouseEvent)
    {
    	QGraphicsView::mousePressEvent(mouseEvent);
    }
    void viewNaff::mouseReleaseEvent(QMouseEvent *mouseEvent) 
    {
    	QGraphicsView::mouseReleaseEvent(mouseEvent);
    }

  12. #12
    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
    pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *pos = mouseEvent->pos();
    Tu as un pointeur sur un QPoint ????
    pour quoi faire ?????

  13. #13
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 88
    Par défaut
    C'est pour récupérer la position actuel du souris qui correspond à QPoint!
    Et ça marche !

  14. #14
    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 doukha Voir le message
    C'est pour récupérer la position actuel du souris qui correspond à QPoint!
    Et ça marche !
    ca marche, mais ca sert à rien de faire un pointeur ici. Les pointeur c'est le diable. Sauf pour les QWidget.


    sinon, y as rien qui te parait bizzare?

    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
    void viewNaff::mouseMoveEvent(QMouseEvent *mouseEvent)
    {
     
    	*pos = mouseEvent->pos();
    	if( (pos->x() >= 0)  && (pos->y() >= 0) )
    		{
    		QString posStr = "x: ";
    		posStr.append(QString::number(pos->x()));
    		posStr.append("| y: ");
    		posStr.append(QString::number(pos->y()));
    		affichageXY->setText(posStr);
    		update();
    	}
    	QGraphicsView::mousePressEvent(mouseEvent); //pour propager l'evenement à la scène
    }

  15. #15
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 88
    Par défaut
    Au temps pour moi
    muchas graçias
    Je voulais ajouter que t'avais aussi raison pour les pointeurs

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

Discussions similaires

  1. Détecter position souris
    Par Glosialabolas dans le forum Linux
    Réponses: 3
    Dernier message: 17/11/2005, 08h42
  2. Réponses: 3
    Dernier message: 05/11/2005, 23h50
  3. Réponses: 2
    Dernier message: 11/09/2005, 05h25
  4. Réponses: 4
    Dernier message: 22/08/2005, 19h19
  5. [MFC] position souris. systeme de coordonnées
    Par Gloubi99 dans le forum MFC
    Réponses: 2
    Dernier message: 20/07/2005, 11h57

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