Qt鼠标事件传播与场景项目

时间:2013-05-27 11:30:36

标签: qt pyqt pyside

当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_())

1 个答案:

答案 0 :(得分:2)

我不确定我理解你的问题。 Qt的文档清楚地说明了以下mousePressEvent方法:

  

鼠标按下事件决定哪个项目应成为鼠标   采集卡。如果您重新实现此功能,默认情况下事件将是   接受(参见QEvent :: accept()),然后这个项目是鼠标   采集卡。这允许项目接收未来的移动,发布和   双击事件。如果在事件上调用QEvent :: ignore(),则此项目   将失去鼠标抓取,并且事件将传播到任何最顶级的项目   下方。

您需要做的就是决定是否调用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