QGraphicsPathItem hoverEvents - 禁止在路径形成的区域上悬停

QGraphicsPathItem hoverEvents - suppress hover on area formed by the path

https://www.dropbox.com/s/phven3rriv36893/graphicsview-pathitem.png?dl=0 我想知道是否有办法让我的 QGraphicsPathItem 响应 mouseHoverEvents 到实际曲线而不是文档中看到的整个橙色区域。

https://www.dropbox.com/s/7m8w34nitp34sgf/pipes.png?dl=0 在我的应用程序中,我没有看到实际形成路径的区域,因此当贝塞尔曲线悬停时我只想要一个 hoverEnterEvent(当然,当贝塞尔曲线离开时我想要一个 hoverLeaveEvent)。

这是否可以通过 QGraphicsPathItem 实现,或者这是一种完全错误的方法?如果是,如何?如果不是,什么 QGraphics 对象可以被认为是替代品?

如果确实需要代码,请告诉我。

干杯, 迈克尔

您需要重新实现 QGraphicsItem.shape 以 return 更准确地表示您的曲线。默认实现为您提供了您所发现的边界框。

Tim Wakeham 的回答是完全正确的:您需要重新实现 shape() 来为您的路径项提供更详细的形状。然而,他的回答并不是完全有用,因为实现一个好的 shape() 方法 return 正确 QPainterPath.

并非易事

更令人困惑,因为在这种情况下,QGraphicsPathItem 已经可以从其 path() 方法中提供 QPainterPath。不幸的是,这通常不是 shape() 方法 return 的正确值,因为它绘制项目而不是界定其外部。

幸运的是,由于这是一个相当标准的要求,因此有一个内置的 class 可以将路径转换为可用于形状的轮廓:QPainterPathStroker.

这是我用来执行此操作的一些代码:

    qp = QtGui.QPainterPathStroker()
    qp.setWidth(MARGIN)
    qp.setCapStyle(QtCore.Qt.SquareCap)
    shape = qp.createStroke(self.path())