Python pyqt4鼠标释放事件不工作

Python pyqt4鼠标释放事件不工作,python,pyqt,pyqt4,Python,Pyqt,Pyqt4,我试图跟踪鼠标按下和鼠标释放事件,但它无法识别鼠标释放事件 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")

我试图跟踪鼠标按下和鼠标释放事件,但它无法识别鼠标释放事件

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
在小部件中启动,然后您可以移动到
QPushButton
QGraphicsView
,让我们假设在这种情况下它落在
QGraphicsView
中,然后它发生在名为
viewport()
的子部件上,这将一直执行,直到某个小部件接受事件,同样的情况也必须发生在
mouseReleaseEvent
上,但是要接收
mouseReleaseEvent
的对象必须接受
MousePresseEvent
事件,并且只有
QGraphicsView
视口()。解决方案是将事件过滤器安装到
QGraphicsView
视口()
,如下所示

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)
类小部件(QWidget):
def uuu init uuu(self,parent=None):
QWidget.\uuuuu init\uuuuuuu(自我,父)
self.btn=QPushButton(“添加行”)
self.gv=QGraphicsView()
self.scene=qgraphicscene(self)
self.gv.setScene(self.scene)
self.gv.setRenderInts(qPaint.Antialiasing | qPaint.SmoothPixmapTransform)
lay=QHBoxLayout(自)
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'
打印(图像位置)
#self.p_item=self.scene.addPixmap(QPixmap(“lena.png”))
self.p_item=self.scene.addPixmap(QPixmap(image_loc))
self.btn.clicked.connect(self.add\u行)
self.gv.viewport().installEventFilter(self)#