Qt的鼠标事件的传播与现场项目(Qt mouse event propagation with sc

2019-10-29 04:38发布

当QGraphicsScene项目的背后是它的子项目,我希望为鼠标采集到后面检查项目,然后抓住最顶层的项目,如果第一没有抓住。

示例代码:

from PySide.QtCore import *
from PySide.QtGui import *

class View(QGraphicsView):
    pass
class Scene(QGraphicsScene):
    pass

class ChildCircle(QGraphicsEllipseItem):
    def __init__(self, parent):
        super(ChildCircle, self).__init__()
        self.setRect(QRect(-20,-20,70,70))
        self.setParentItem( parent )

    def mousePressEvent(self, event):
        print "Circle is Pressed", event.pos()

class ParentRectangle(QGraphicsRectItem):
    def __init__(self, scene):
        super(ParentRectangle, self).__init__()
        self.scene = scene
        self.setRect(QRect(0,0,20,20))
        self.scene.addItem(self)

        circle = ChildCircle(self)

    def mousePressEvent(self, event):
        print "Rectangle PRESS", event.pos()


class Window(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.s = Scene()
        self.s.setSceneRect(-200,-100,300,300,)

        self.v = View(self.s)
        self.v.setDragMode(QGraphicsView.ScrollHandDrag)
        self.setCentralWidget(self.v)

        ParentRectangle(self.s)

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    window = Window()
    window.resize(300, 200)
    window.show()
    sys.exit(app.exec_())

Answer 1:

我不知道我理解你的问题。 在Qt的文档明确表示,有关以下mousePressEvent方法:

鼠标按下事件决定哪些项目应该成为鼠标抓取。 如果你重新实现这个功能, 事件将被默认接受 (见的QEvent ::接受()),而这个产品然后将鼠标抓取。 这使得该项目获得未来的移动,释放和双击事件。 如果你打电话的QEvent ::忽略()事件,这个项目就失去了鼠标抢, 和事件将传播到任何位于最顶层

所有你需要做的是,以决定是否要调用QEvent::ignore方法还是不行。 因此,举例来说,如果圆圈对象不会总是忽略鼠标的新闻发布会上,该矩形对象永远是鼠标采集卡(如果你点击矩形)。 在此代码鼠标采集是你点击的项目。

class ChildCircle(QGraphicsEllipseItem):
    def __init__(self, parent=None):
        super(ChildCircle, self).__init__(parent)
        self.setRect(QRect(-20,-20,70,70))
        self.setFlags(QGraphicsItem.ItemIsMovable)

    def mousePressEvent(self, event):
        # Ugly way to know there are items except self
        if len(self.scene().items(event.scenePos())) > 1:
            # Propogate the event to the parent
            event.ignore()

class ParentRectangle(QGraphicsRectItem):
    def __init__(self, scene, parent=None):
        super(ParentRectangle, self).__init__(parent)
        self.scene = scene
        self.setRect(QRect(0,0,20,20))
        self.scene.addItem(self)
        circle = ChildCircle(self)
        self.setFlags(QGraphicsItem.ItemIsMovable)

    def mousePressEvent(self, event):
        pass


文章来源: Qt mouse event propagation with scene items
标签: qt pyqt pyside