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

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

现在我想听一下鼠标事件,比如输入,离开,点击……我在QGraphicsItem上实现hoverEnterEvent的简单方法在移动过孔时不会创建鼠标事件,因为这个洞仍然是项目的一部分,即使它没有被填满.

我希望有一个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_()

最佳答案 似乎QGraphicsItem的方法形状默认为
returns the bounding rectangle.其返回路径用于确定位置是在复杂形状的内部还是外部.但是在QGraphicsPathItem的情况下,我们已经有了一个路径并返回它而不是边界矩形可以解决问题.令我惊讶的是.

只需将这两行添加到问题的QGraphicsPathItem派生词中.

def shape(self):
    return self.path()
点赞