我在使用Python中的PySide绑定程序中的Qt创造了一个QGraphicsPathItem,其中包含一个大矩形和一个小矩形。由于默认填充规则(Qt.OddEvenFill),内部矩形是透明的。这实际上画了一个带有洞的形状。
现在我想监听鼠标事件,如进入、离开、单击等。我简单的做法是实现QGraphicsItem的hoverEnterEvent等函数,但是当鼠标移到洞口时就不会产生鼠标事件,因为即使洞没有填充,它仍然是图元的一部分。
我想要创建一个QGraphicsItem的导出类,它显示的是一个自定义形状,其轮廓由QPainterPath或一个或多个多边形定义,并且可以有洞。当鼠标进入洞时,应将其视为形状之外。
下面是一个带有洞的例子(当鼠标在内部矩形中时,应将其视为形状的外部,应触发鼠标离开事件):
但是该解决方案也应适用于具有洞的任意形状。
以下是PySide/Python 3.3的示例代码。
现在我想监听鼠标事件,如进入、离开、单击等。我简单的做法是实现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_()
shape
默认总是返回边界矩形,这也有点违反直觉。这就是为什么我在这里留下这个问题的原因。 - Trilarion