我有一个 QGraphicsEllipseItem 和一个 QGraphicsScene,它们都有自定义 mouseMoveEvent 和 mousePressEvent 函数。然而,由于某种原因,mouseMoveEvent 似乎只适用于 QGraphicsScene。我的猜测是 QGraphicsScene 事件覆盖了 QGraphicsEllipseItem 事件。但是,由于某种原因, mousePressEvent 对两者都适用。有没有办法让 mouseMoveEvent 对它们都起作用?
from PyQt5.QtWidgets import *
class CustomEllipseItem(QGraphicsEllipseItem):
def __init__(self, *args, **kwargs):
super(CustomEllipseItem, self).__init__(*args, **kwargs)
def mousePressEvent(self, event):
print("EllipseItem mousePressEvent")
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
print("EllipseItem mouseMoveEvent")
super().mouseMoveEvent(event)
class CustomScene(QGraphicsScene):
def __init__(self, *args, **kwargs):
super(CustomScene, self).__init__(*args, **kwargs)
def mousePressEvent(self, event):
print("Scene mousePressEvent")
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
print("Scene mouseMoveEvent")
super().mouseMoveEvent(event)
if __name__ == '__main__':
app = QApplication([])
scene = CustomScene()
view = QGraphicsView(scene)
ellipse_item = CustomEllipseItem(0, 0, 100, 100)
scene.addItem(ellipse_item)
view.show()
app.exec_()
如果您的目标是简单地在从椭圆项半径内部移动鼠标时触发两个事件,那么您可以通过将
ItemIsSelectable
标志添加到 CustomEllipseItem
来实现此目的。
例如:
from PyQt5.QtWidgets import *
class CustomEllipseItem(QGraphicsEllipseItem):
def __init__(self, *args, **kwargs):
super(CustomEllipseItem, self).__init__(*args, **kwargs)
self.setFlag(self.GraphicsItemFlag.ItemIsSelectable) # <--- here
def mousePressEvent(self, event):
print("EllipseItem mousePressEvent")
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
print("EllipseItem mouseMoveEvent")
super().mouseMoveEvent(event)
class CustomScene(QGraphicsScene):
def __init__(self, *args, **kwargs):
super(CustomScene, self).__init__(*args, **kwargs)
def mousePressEvent(self, event):
print("Scene mousePressEvent")
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
print("Scene mouseMoveEvent")
super().mouseMoveEvent(event)
if __name__ == '__main__':
app = QApplication([])
scene = CustomScene()
view = QGraphicsView(scene)
ellipse_item = CustomEllipseItem(0, 0, 100, 100)
scene.addItem(ellipse_item)
view.show()
app.exec_()