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 :

Superposition entre QGraphicsView et QGraphicsScene [Graphics View]

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut Superposition entre QGraphicsView et QGraphicsScene
    Bonjour tout le monde,

    je rencontre un problème similaire à un précédent projet Qt mais je n'arrive pas à en venir à bout.

    Pour faire simple, j'ai :

    - 1 Widget principal avec un layout vertical principal qui contient :
    * 1 premier widget perso contenant des boutons
    * 1 vue (QGraphicsView perso)
    * 1 label

    View.h :

    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
    class View : public QGraphicsView
    {
      Q_OBJECT
     
      public :
        explicit View(QWidget *parent = 0);
        ~View();
     
        Scene* getScene();
     
      signals :
        void mouseMoved(int x, int y);
        void sendPos(int x, int y);
     
      protected :
        virtual void mouseMoveEvent(QMouseEvent *mouseEvent);
        virtual void mousePressEvent(QMouseEvent *mouseEvent);
     
      private :
        Scene *scene;
        int posX;
        int posY;
    };
    View.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    View::View(QWidget *parent) : QGraphicsView(parent)
    {
      scene = new Scene();
      this->setScene(scene);
      this->setMouseTracking(true);
      //this->setSceneRect(QRectF(scene->sceneRect()));
     
      connect(this, SIGNAL(sendPos(int,int)), scene, SLOT(getPos(int,int)));
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void View::mousePressEvent(QMouseEvent *mouseEvent)
    {
      posX = mouseEvent->pos().x();
      posY = mouseEvent->pos().y();
     
      emit sendPos(posX, posY);
    }
    Scene.h :

    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
    class Scene : public QGraphicsScene
    {
      Q_OBJECT
     
      public :
        explicit Scene(QObject *parent = 0);
        ~Scene();
     
        void createItem(int x, int y);
     
      public slots :
        void getPos(int x, int y);
     
      signals :
     
      protected :
        virtual void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);
        virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent);
     
      private :
    };
    Scene.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Scene::getPos(int x, int y)
    {
        this->createItem(x, y);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Scene::createItem(int x, int y)
    {
      qDebug() << "view x : " << x << " y : " << y;
     
      QGraphicsItem *ball = new QGraphicsEllipseItem(x, y, 50, 50, 0, this);
      this->addItem(ball);
    }
    Or, mon problème est que, quand je clic à un endroit sur la vue, mon objet ball ne se dessine pas à l'endroit ou j'ai cliqué mais plus loin en bas à gauche de ce clic (distance flagrante). Ca vient probablement du passage du système de coords de la scène à la vue.

    Seulement, la dernière fois que j'avais eu ce problème, un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->setSceneRect(QRectF(this->rect()));
    l'avait réglé et la vue et la scène était parfaitement superposées..

    Comment ça se fait ? Y a-t-il un moyen de faire en sorte que la coordonnée dans la vue corresponde exactement à celle dans la scène sans pour autant devoir utiliser de manière fastidieuse les mapFrom/mapTo ?

    Je vous remercie !

    PS : Si j'ajoute la transformation mapToScene dans mousePressEvent, ca fonctionne bien.. mais je me rappelle que la première fois que j'avais utilisé une vue et une scène, j'avais pas eu besoin de transfo pour les superposer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void View::mousePressEvent(QMouseEvent *mouseEvent)
    {
      posX = mouseEvent->pos().x();
      posY = mouseEvent->pos().y();
     
    //  QPointF point = this->mapToScene(QPoint(posX, posY));
     
      emit sendPos(posX, posY);
    }

  2. #2
    Membre éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut
    Bon après quelques bidouilles, il semblerait que je dois juste jouer sur le setGeometry de ma vue pour que ça colle avec la position x,y renvoyée lors du déplacement de la souris sur l'écran.

    En fait, je peux parcourir ma vue de 0,0 à 800,400 par exemple alors qu'en taille, elle fait à peine 100:30. Et comme après j'utilise cette dimension pour le sceneRect, forcément ça fait un gros décalage :s

    Edit : Désolé pour le doublepost, c'était pour apporter la réponse.

    Cependant il y a un nouveau mystère : pourquoi ma vue à l'écran prend la même place en largeur qu'un widget au dessus dans le layout mais que le widget du dessus a une largeur de 640 contre 100 pour la vue ?

    Aussi, la position retournée par mousePressEvent de ma vue dépasse largement sa taille ... (les positions retournées sont cohérentes avec le widget principal (800, 500) et donc la place que prend la vue dans celui-ci mais n'ont pas de rapport direct avec la taille réelle de la vue ... Une idée ?

    EDIT : Pour ceux qui seraient intéressés par la solution. J'ai en fait réimplémenté dans ma vue la méthode resizeEvent() dans laquelle je récupère le viewport de ma vue pour adapter le rect de la scène à celui-ci. C'est ce petit décalage entre la scène et la vue qui se répercutait dans le dessin des figures.

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

Discussions similaires

  1. [Graphics View] QGraphicsView et QGraphicsScene
    Par DeathManiak dans le forum Débuter
    Réponses: 9
    Dernier message: 12/11/2012, 18h59
  2. Superposition entre Div et img
    Par zooffy dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 14/09/2012, 20h00
  3. [Débutant] superposition entre plusieurs images
    Par crespo 12 dans le forum Images
    Réponses: 1
    Dernier message: 25/06/2012, 12h57
  4. Héritage multiple entre QObject et QGraphicsScene
    Par stalker8 dans le forum Débuter
    Réponses: 3
    Dernier message: 11/06/2012, 22h35
  5. Différence de juxtaposition/superposition entre IE7 et FF
    Par Invité dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 02/04/2008, 01h24

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