hoverEnterEvent could not be triggered

75 views
Skip to first unread message

你你

unread,
Jul 10, 2022, 2:00:11 PM7/10/22
to pyqtgraph
Hi, I implemented a  LineItem class finally inheriting QGraphicsPathItem, to draw a simple line by specifying a start point and an end point. It works fine only there's a problem regarding mouse hover. It's really strange that when I draw a horizontal line, no matter how I tried the mouse hover or mouse click, there will be no  hoverEnterEvent nor  mouseClickEvent triggered. However, if I draw a line that's not horizontal, both the  hoverEnterEvent and mouseClickEvent will be triggered. My code's shown below, does anyone know what's going on here, what else do I need to add to my code ? Many thanks! lines.png

class LineItem(GraphicsPathItem,QtCore.QObject):
    sigHoveredEnter = QtCore.Signal(object, object,object)
    sigHoveredLeave = QtCore.Signal(object, object)
    sigClicked = QtCore.Signal(object, object)
    def __init__(self,start=None, end=None, data = None, parent=None, **opts) -> None:
        self._start = start
        self._end = end
        self.data = data
        QtCore.QObject.__init__(self)
        GraphicsPathItem.__init__(self, parent, **opts)
        self.setAcceptHoverEvents(True)

    def hoverEnterEvent(self, ev):
        self.sigHoveredEnter.emit(self, ev, self.data)
        logger.debug('line Enter')

    def makePath(self):
        path = QtGui.QPainterPath()
        path.moveTo(*self._start)
        path.lineTo(*self._end)
        return path

    def mouseClickEvent(self, ev):
        self.sigClicked.emit(self, ev, self.data)
        logger.debug('line clicked.')
       
       
class GraphicsPathItem(QtGui.QGraphicsPathItem):
    __metaclass__ = ABCMeta
    def __init__(self, parent=None, **opts) -> None:
        self.opts = {}
        QtGui.QGraphicsPathItem.__init__(self, parent)
        defaultOpts = {
            'pxMode': False,
            'pen': (200,200,200),
            'brush': (190, 190, 190),
        }
        defaultOpts.update(opts)
       
        self.setStyle(**defaultOpts)

    def setStyle(self, **opts):
        needUpdate = False
        for k,v in opts.items():
            if self.opts.get(k) != v:
                needUpdate = True
            self.opts[k] = v

        if not needUpdate:
            return
       
        tr = QtGui.QTransform()
        self.path = tr.map(self.makePath())

        self.setPath(self.path)
       
        self.setPen(fn.mkPen(self.opts['pen']))
        self.setBrush(fn.mkBrush(self.opts['brush']))
       
        if self.opts['pxMode']:
            self.setFlags(self.flags() | self.GraphicsItemFlag.ItemIgnoresTransformations)
        else:
            self.setFlags(self.flags() & ~self.GraphicsItemFlag.ItemIgnoresTransformations)

    @abstractmethod
    def makePath(self):
        pass
   
    def paint(self, p, *args):
        p.setRenderHint(QtGui.QPainter.RenderHint.Antialiasing)
        super().paint(p, *args)
       
    def shape(self):
        return self.path
   
    def dataBounds(self, ax, frac, orthoRange=None):
        pw = 0
        pen = self.pen()
        if not pen.isCosmetic():
            pw = pen.width() * 0.7072
        if self.opts['pxMode']:
            return [0,0]
        else:
            br = self.boundingRect()
            if ax == 0:
                return [br.left()-pw, br.right()+pw]
            else:
                return [br.top()-pw, br.bottom()+pw]
       
    def pixelPadding(self):
        pad = 0
        if self.opts['pxMode']:
            br = self.boundingRect()
            pad += hypot(br.width(), br.height())
        pen = self.pen()
        if pen.isCosmetic():
            pad += max(1, pen.width()) * 0.7072
        return pad

Ognyan Moore

unread,
Jul 10, 2022, 3:44:40 PM7/10/22
to pyqt...@googlegroups.com
We've encountered something similar with our version of InfiniteLine which we haven't ironed out.  A first thing you can try is to redefine your "shape" method to something like....

def shape(self)
    p = self.path
    p.addRect(self.boundingRect())
    return p

For debugging purposes, you may want to draw the boundingRect around the line to see if the rectangle has some 0-thickness making it impossible to register mouse events.

--
You received this message because you are subscribed to the Google Groups "pyqtgraph" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pyqtgraph+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/pyqtgraph/a9da8789-a777-40be-b98f-1510c9c65400n%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages