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