gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:29:06 25 4
gpt4 key购买 nike

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

现在我想监听鼠标事件,如进入、离开、单击……移动到洞上时的事件,因为洞仍然是项目的一部分,即使它没有被填充。

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

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

Shape with a hole

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

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 方法似乎默认来自 QGraphicsItem returns the bounding rectangle .它的返回路径用于确定某个位置是在复杂形状的内部还是外部。但是在 QGraphicsPathItem 的情况下,我们已经有了路径并返回它而不是边界矩形可以解决问题。令我惊讶的是它确实如此。

只需将这两行添加到问题的 QGraphicsPathItem 派生项中即可。

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

关于python - 如何为 QGraphicsItem 中有孔的形状获取鼠标悬停事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26897434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com