Bonjour à tous
je ne comprend pas bien le comportement de la methode paint des QGraphicsItem. J'explique mon problème :
Je voudrais afficher un graph assez basique pour l'instant, des arcs et des sommets. J'ai une classe qui herite de QGraphicsView et qui contient une QGraphicsScene (déjà ça je sais pas trop si c'est une bonne idée ? )
J'ai également 2 classes qui héritent QGraphicsItem : GPoint (le G est pour Graphic bande de petits polissons) et GArc
Ma classe GPoint a un QPointF en attribut pour garder les coordonnées du point à afficher, GArc a 2 attributs GPoint, les 2 sommets de l'arc
Les headers allégés des classes:
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 class GPoint : public QGraphicsItem { //ATTRIBUTS public: QPointF point; //coordonnées 2D float size; //taille du point à l'écran //METHODES public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void mousePressEvent(QGraphicsSceneMouseEvent* event); void mouseMoveEvent(QGraphicsSceneMouseEvent* event); };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 class GArc : public QGraphicsItem { //ATTRIBUTS public: GPoint* ini; GPoint* fin; //METHODES public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); };
Pour mes sommets je dessine des carrés centrés sur 'point', et pour les arcs je trace des lignes qui utilisent les 'point' de 'ini' et 'fin'.
les méthodes paint:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void GPoint::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { painter->drawRect(QRectF(point.x()-size/2, point.y()-size/2, size, size )); } void GArc::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { painter->drawLine(ini->getPoint(), fin->getPoint()); }
L'affichage est correct, le problème survient quand je veux déplacer mes points. Je voudrais bêtement que quand je déplace un point l'arc soit retracé avec les nouvelles coordonnées du sommet.
Ma méthode GPoint::paint(...) utilise a priori uniquement les coordonnées de 'point' pour faire le tracé. Ce que je ne comprends pas c'est que dans ma méthode mouseMoveEvent, même si je ne modifie absolument pas les coordonnées de 'point', je peux tout de même déplacer le point à l'écran. Comme si paint() utilisait les coordonnées du QGraphicsItem (y a des méthodes x(), setX() etc... pour cette classe) pour afficher mon GPoint !
est ce que quelqu'un pourrait m'aider à éclaircir ce mystère ?! Parce que là tout ce que je tente de faire dans mes mouseEvent a un comportement qui m'apparait comme complètement aléatoire...
merci beaucoup à ceux qui prendront la peine de déchiffrer tout ça, hésitez pas à demander des clarifications.
Partager