QGraphicsPathItem hoverEvents - 抑制由路径形成的区域上的悬停

时间:2015-09-06 22:13:03

标签: qt pyqt qgraphicsitem qgraphicsscene mousehover

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对象可以被视为替代?

如果真的需要代码,请告诉我。

干杯, 迈克尔

2 个答案:

答案 0 :(得分:3)

Tim Wakeham的回答是完全正确的:你需要重新实现shape(),为你的路径项提供更详细的形状。但是,他的回答并不完全有用,因为实现一个返回右shape()的好QPainterPath方法并非易事。

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

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

这是我用来做的一些代码:

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

答案 1 :(得分:0)

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