pyqt4鼠标释放事件未触发

pyqt4 mouse release event not firing

我正在尝试跟踪鼠标按下和鼠标释放事件,但无法识别鼠标释放事件。

import sys, os

from PyQt4.QtCore import *
from PyQt4.QtGui import *



class Widget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.btn = QPushButton("Add Line")

        self.gv = QGraphicsView()
        self.scene = QGraphicsScene(self)
        self.gv.setScene(self.scene)
        self.gv.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)

        lay = QHBoxLayout(self)
        lay.addWidget(self.btn)
        lay.addWidget(self.gv)
        script_dir = sys.path[0]

        image_loc = os.path.dirname(script_dir) + '/testproject/configs/files/lena.png'
        print image_loc
        #self.p_item = self.scene.addPixmap(QPixmap("lena.png"))
        self.p_item = self.scene.addPixmap(QPixmap(image_loc))

        self.btn.clicked.connect(self.add_line)

    def add_line(self, event):
        import pprint
        print pprint.pprint(dir(event))
        pass

    def mousePressEvent(self, QMouseEvent):
        print 'mouse press event = ', QMouseEvent.pos()

    def mouseReleaseEvent(self, QMouseEvent):
        print 'mouse release event = ', QMouseEvent.pos()
        # cursor = QCursor()
        # print 'mouse release event = ', cursor.pos()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

在 Qt 中,事件从父级传递给子级,反之则不然。在你的情况下,事件 mousePressEvent 在 Widget 中开始,然后你可以移动到 QPushButtonQGraphicsView,让我们假设在这种情况下它落在 QGraphicsView 然后它发生对于名为 viewport() 的子小部件,这将完成,直到某个小部件接受事件,mouseReleaseEvent 也必须发生同样的情况,但是对于接收 mouseReleaseEvent 的对象必须已经接受了 mousePressEvent 事件,唯一这样做的是 QGraphicsViewviewport()。解决方案是在 QGraphicsViewviewport() 中安装一个事件过滤器,如下所示。

class Widget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)    
        self.btn = QPushButton("Add Line")

        self.gv = QGraphicsView()
        self.scene = QGraphicsScene(self)
        self.gv.setScene(self.scene)
        self.gv.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)

        lay = QHBoxLayout(self)
        lay.addWidget(self.btn)
        lay.addWidget(self.gv)
        script_dir = sys.path[0]

        image_loc = os.path.dirname(script_dir) + '/testproject/configs/files/lena.png'
        print(image_loc)
        #self.p_item = self.scene.addPixmap(QPixmap("lena.png"))
        self.p_item = self.scene.addPixmap(QPixmap(image_loc))

        self.btn.clicked.connect(self.add_line)

        self.gv.viewport().installEventFilter(self) # <----

    def add_line(self, event):
        import pprint
        print(pprint.pprint(dir(event)))

    def eventFilter(self, obj, event):
        if obj is self.gv.viewport():
            if event.type() == QEvent.MouseButtonPress:
                print('mouse press event = ', event.pos())
            elif event.type() == QEvent.MouseButtonRelease:
                print('mouse release event = ', event.pos())

        return QWidget.eventFilter(self, obj, event)