代码之家  ›  专栏  ›  技术社区  ›  banjo bill

如何避免QgraphicsView吃掉鼠标事件

  •  1
  • banjo bill  · 技术社区  · 6 年前

    我希望鼠标事件到达适当的qgraphicsItem,但它们只得到qgraphicsView。

    我已经将代码减少到41行,注释掉了事件处理程序,但没有任何效果。如果有处理程序,则由qgraphicsView处理;如果没有,则完全不捕获。

    我肯定我遗漏了一些明显的东西,但我看不见。

    from PyQt5.QtWidgets import *
    
    class MyFrame(QGraphicsView):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setScene(QGraphicsScene())
            self.scene().addItem(Group())
    
        def mouseReleaseEvent(self, event):
            print('in QGraphicsView')
            return QGraphicsView.mouseReleaseEvent(self, event)
    
    class Group(QGraphicsItemGroup):
        def __init__(self, parent=None):
            super().__init__()
    
            item = MyEllipse(0, 0, 20, 20)
            self.addToGroup(item)
    
        def mouseReleaseEvent(self, event):
            print('in QGraphicsItemGroup')
            return QGraphicsItemGroup.mouseReleaseEvent(self, event)
    
    class MyEllipse(QGraphicsEllipseItem):
        def mouseReleaseEvent(self, event):
            print('in QGraphicsEllipseItem')
            return QGraphicsEllipseItem.mouseReleaseEvent(self, event)
    
    if __name__ == '__main__':
        app = QApplication([])
        f = MyFrame()
        f.show()
        app.exec_()
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   eyllanesc Yonghwan Shin    6 年前

    mouseReleaseEvent 如果且仅当事件 mousePressEvent 接受句柄,因此使用以下代码事件将到达 QGraphicsItemGroup :

    class Group(QGraphicsItemGroup):
        def __init__(self, parent=None):
            super().__init__()
    
            item = MyEllipse(0, 0, 20, 20)
            self.addToGroup(item)
    
        def mousePressEvent(self, event):
            QGraphicsItemGroup.mousePressEvent(self, event)
            event.accept()
    
        def mouseReleaseEvent(self, event):
            print('in QGraphicsItemGroup')
            QGraphicsItemGroup.mouseReleaseEvent(self, event)
    

    但作为 @ekhumoro 指出,qgraphicsItemGroup作为单个元素,因此事件不会传输到它们处理的项目。

    如果要检测何时按下项目,可以使用以下方法:

    class Group(QGraphicsItemGroup):
        def __init__(self, parent=None):
            super().__init__()
    
            self._item = MyEllipse(0, 0, 20, 20)
            self.addToGroup(self._item)
    
        def mousePressEvent(self, event):
            QGraphicsItemGroup.mousePressEvent(self, event)
            event.accept()
    
        def mouseReleaseEvent(self, event):
            print('in QGraphicsItemGroup')
            if self._item.mapToParent(self._item.boundingRect()).containsPoint(event.pos(), Qt.OddEvenFill):
                print("_item")
            QGraphicsItemGroup.mouseReleaseEvent(self, event)