highlight QGraphicsItem
-
Hi
What about just subclass QGraphicsItem and paint it yourselfclass SimpleItem : public QGraphicsItem { public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { draw the lines / with or without highlight } };
@mrjj
there i draw without the highlight. it's okay.
forhoverEnterEvent
i need to draw WITH highlight -
Hi,
You can trigger a repaint in the
hoverEnterEvent
. -
@SGaist
yes, but how should i draw a "border" around the line? -
Paint a rectangle that is slightly bigger that the geometry of your widget.
-
@SGaist
yes, but how should i draw a "border" around the line?@user4592357 the same draw function needs to know when it needs to draw the highlight or just the line... how you do that depends on details of your implementation which you have not shared with us yet. I am sure you can figure some way to do it though :-).
-
@user4592357 the same draw function needs to know when it needs to draw the highlight or just the line... how you do that depends on details of your implementation which you have not shared with us yet. I am sure you can figure some way to do it though :-).
@kenchan
it is inPython
, sorry. my tries are in vain:class Item(QGraphicsItem): def __init__(self, x, y): super(ErrorItem, self).__init__() self.__x = x self.__y = y self.__hovered = False self.setAcceptHoverEvents(True) def paint(self, painter, option, widget): pen = QPen(Qt.red) pen.setWidth(4) painter.setPen(pen) painter.drawLine(QPoint(0, 0), QPoint(100, 100)) painter.drawLine(QPoint(0, 100), QPoint(100, 0)) if self.__hovered: # what should go here? pen.setColor(Qt.white) pen.setWidth(8) self.__hovered = False # painter.drawLine(QPoint(-50, -50), QPoint(103, 103)) def boundingRect(self): return QRectF(0, 0, 100, 100) def hoverEnterEvent(self, event): # self.setGraphicsEffect(QGraphicsColorizeEffect()) self.__hovered = True def hoverLeaveEvent(self, event): self.setGraphicsEffect(None)
-
@kenchan
it is inPython
, sorry. my tries are in vain:class Item(QGraphicsItem): def __init__(self, x, y): super(ErrorItem, self).__init__() self.__x = x self.__y = y self.__hovered = False self.setAcceptHoverEvents(True) def paint(self, painter, option, widget): pen = QPen(Qt.red) pen.setWidth(4) painter.setPen(pen) painter.drawLine(QPoint(0, 0), QPoint(100, 100)) painter.drawLine(QPoint(0, 100), QPoint(100, 0)) if self.__hovered: # what should go here? pen.setColor(Qt.white) pen.setWidth(8) self.__hovered = False # painter.drawLine(QPoint(-50, -50), QPoint(103, 103)) def boundingRect(self): return QRectF(0, 0, 100, 100) def hoverEnterEvent(self, event): # self.setGraphicsEffect(QGraphicsColorizeEffect()) self.__hovered = True def hoverLeaveEvent(self, event): self.setGraphicsEffect(None)
@user4592357 Sorry I don't develop Qt with Python...
Maybe you could put the line drawing bits after the if statement and make that just change the colour and the thickness?
Since you can draw the line normally then that should work as before, right?
The next issue will be if your hovered flag is getting changed when the event is fired. Can you debug that to check it?
Finally i guess you will want to force the scene to redraw, if that is the problem you are seeing.
I would have thought that the scene would be redrawn when the hover events happen?
I believe the default implementation of hoveredEnterEvent() function just calls update(). Maybe you should call update() or something?
I think you should reset the hovered flag to false in the hoverLeaveEvent so it only happens when you are actually hovering over it :-) -
@user4592357 Sorry I don't develop Qt with Python...
Maybe you could put the line drawing bits after the if statement and make that just change the colour and the thickness?
Since you can draw the line normally then that should work as before, right?
The next issue will be if your hovered flag is getting changed when the event is fired. Can you debug that to check it?
Finally i guess you will want to force the scene to redraw, if that is the problem you are seeing.
I would have thought that the scene would be redrawn when the hover events happen?
I believe the default implementation of hoveredEnterEvent() function just calls update(). Maybe you should call update() or something?
I think you should reset the hovered flag to false in the hoverLeaveEvent so it only happens when you are actually hovering over it :-)@kenchan
drawing the line thicker isn't a problem, but i don't know how to draw a red line (normal) + the highlight (outline) around it which is white -
@kenchan
drawing the line thicker isn't a problem, but i don't know how to draw a red line (normal) + the highlight (outline) around it which is white@user4592357
if you can draw it one way you can draw it the other way right?
So what exactly is the problem now then, the events are not working? the events work but your draw functions is not getting called when expect? -
@user4592357
if you can draw it one way you can draw it the other way right?
So what exactly is the problem now then, the events are not working? the events work but your draw functions is not getting called when expect?@kenchan
as you can see in code, i set a boolean in hover event and in paint() check - if it's hovered draw outline, but it doesn't. i also tried to call update() insidehoverEnterEvent
- still no luck -
@kenchan
drawing the line thicker isn't a problem, but i don't know how to draw a red line (normal) + the highlight (outline) around it which is white@user4592357
What don't you understand about how to draw it?
If you want an outline around a line the easiest way is to draw a thin line on top of a thicker line using the same two points.
You draw the thick one first then you draw the thin one on top. If you want to make absolutely sure that the thin one is on top you can set the z value of it to be above the thick one. -
@kenchan
as you can see in code, i set a boolean in hover event and in paint() check - if it's hovered draw outline, but it doesn't. i also tried to call update() insidehoverEnterEvent
- still no luck@user4592357
And does you hovered flag actually get set? -
@kenchan
as you can see in code, i set a boolean in hover event and in paint() check - if it's hovered draw outline, but it doesn't. i also tried to call update() insidehoverEnterEvent
- still no luck@user4592357
Are you adding the pen thickness to your bounding rect?
Also, I think you must call prepareGeometyChange() if you change the shape or size of the bounding box etc.
You usually call this in a setting function that results in a change in shape. In your case you probably want to do it in your event function. -
@user4592357
And does you hovered flag actually get set?@kenchan
z value of what?QLine
? -
@kenchan
z value of what?QLine
?@user4592357
Ah, sorry that is a property of your graphics item :-) no, I think just the draw order should work for the painter. -
@kenchan
z value of what?QLine
?@user4592357
So, did you have any luck with it yet? -
@user4592357
So, did you have any luck with it yet?@kenchan
no this is what i get:no hover:
after hover:
code:
def paint(self, painter, option, widget): pen = QPen(Qt.red) if self.__hovered: # what should go here? self.__hovered = False pen.setColor(Qt.white) pen.setWidth(8) painter.setPen(pen) painter.drawLine(QPoint(0, 0), QPoint(100, 100)) painter.drawLine(QPoint(0, 100), QPoint(100, 0)) pen.setWidth(4) painter.setPen(pen) line = QLine(QPoint(0, 0), QPoint(100, 100)) painter.drawLine(line) painter.drawLine(QPoint(0, 100), QPoint(100, 0)) def boundingRect(self): return QRectF(0, 0, 108, 108) def hoverEnterEvent(self, event): # self.setGraphicsEffect(QGraphicsColorizeEffect()) self.__hovered = True self.update() self.prepareGeometryChange() def hoverLeaveEvent(self, event): self.setGraphicsEffect(None)
-
@kenchan
no this is what i get:no hover:
after hover:
code:
def paint(self, painter, option, widget): pen = QPen(Qt.red) if self.__hovered: # what should go here? self.__hovered = False pen.setColor(Qt.white) pen.setWidth(8) painter.setPen(pen) painter.drawLine(QPoint(0, 0), QPoint(100, 100)) painter.drawLine(QPoint(0, 100), QPoint(100, 0)) pen.setWidth(4) painter.setPen(pen) line = QLine(QPoint(0, 0), QPoint(100, 100)) painter.drawLine(line) painter.drawLine(QPoint(0, 100), QPoint(100, 0)) def boundingRect(self): return QRectF(0, 0, 108, 108) def hoverEnterEvent(self, event): # self.setGraphicsEffect(QGraphicsColorizeEffect()) self.__hovered = True self.update() self.prepareGeometryChange() def hoverLeaveEvent(self, event): self.setGraphicsEffect(None)
@user4592357
Hmm so that red thing is your thin line version? -
@user4592357
Hmm so that red thing is your thin line version?@kenchan
yes -
@kenchan
yes@user4592357
so, it is drawing it but in the wrong place?