如何让两个mouseMoveEvents一起工作

问题描述 投票:0回答:1

我有一个 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_()
python pyqt pyqt5
1个回答
0
投票

如果您的目标是简单地在从椭圆项半径内部移动鼠标时触发两个事件,那么您可以通过将

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_()
© www.soinside.com 2019 - 2024. All rights reserved.