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)
似乎该方法默认shape返回边界矩形。它返回的路径用于确定某个位置是在复杂形状的内部还是外部。然而,如果我们已经有一条路径,返回它而不是边界矩形可以解决问题。令我惊讶的是,确实如此。QGraphicsItemQGraphicsPathItem
只需将这两行添加到QGraphicsPathItem问题的导数中即可。
def shape(self):
return self.path()
Run Code Online (Sandbox Code Playgroud)