如何为QGraphicsItem中有孔的形状获取鼠标悬停事件?

Tri*_*ion 5 python qt shape mouseevent pyside

QGraphicsPathItem在 Qt 中有一个(使用 Python 中的 PySide 绑定),其中有一个大矩形和一个小矩形。由于默认填充规则 ( Qt.OddEvenFill),内部矩形是透明的。这有效地绘制了一个带孔的形状。

现在我想听听像进入,离开鼠标事件,单击,...我的简单实现的方法hoverEnterEvent,..中QGraphicsItem不会产生鼠标事件移动过孔时,因为孔仍是该项目的一部分,即使它是没有填满。

我想要一个QGraphicsItem衍生物,它显示一个自定义形状,其轮廓由一个QPainterPath或一个或多个多边形定义,并且可以有孔,当鼠标进入孔时,这被视为形状的外部。

带孔的示例形状(当鼠标位于内部矩形中时,应将其视为形状的外部,并应触发鼠标离开事件):

有洞的形状

然而,该解决方案也适用于带孔的任意形状。

PySide/Python 3.3 中的示例代码

from PySide import QtCore, QtGui

class MyPathItem(QtGui.QGraphicsPathItem):

    def __init__(self):
        super().__init__()
        self.setAcceptHoverEvents(True)

    def hoverEnterEvent(self, event):
        print('inside')

    def hoverLeaveEvent(self, event):
        print('outside')

app = QtGui.QApplication([])

scene = QtGui.QGraphicsScene()
path = QtGui.QPainterPath()
path.addRect(0, 0, 100, 100)
path.addRect(25, 25, 50, 50)

item = MyPathItem()
item.setPath(path)
item.setBrush(QtGui.QBrush(QtCore.Qt.blue))

scene.addItem(item)

view = QtGui.QGraphicsView(scene)
view.resize(200, 200)
view.show()

app.exec_()
Run Code Online (Sandbox Code Playgroud)

Tri*_*ion 4

似乎该方法默认shape返回边界矩形。它返回的路径用于确定某个位置是在复杂形状的内部还是外部。然而,如果我们已经有一条路径,返回它而不是边界矩形可以解决问题。令我惊讶的是,确实如此。QGraphicsItemQGraphicsPathItem

只需将这两行添加到QGraphicsPathItem问题的导数中即可。

def shape(self):
    return self.path()
Run Code Online (Sandbox Code Playgroud)