【问题标题】:pyqt4 mouse release event not firingpyqt4鼠标释放事件未触发
【发布时间】:2018-11-26 00:42:38
【问题描述】:

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

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

【问题讨论】:

    标签: python pyqt pyqt4


    【解决方案1】:

    在 Qt 中,事件是从父级传递给子级的,反之则不然。在您的情况下,事件mousePressEvent 在小部件中开始,然后您可以移动到QPushButtonQGraphicsView,假设在这种情况下它属于QGraphicsView,然后它发生在您的名为viewport() 的子小部件上, 这将在某些小部件接受事件之前完成,mouseReleaseEvent 必须发生同样的情况,但是对于接收mouseReleaseEvent 的对象必须已经接受了mousePressEvent 事件,并且唯一这样做的是viewport()QGraphicsView。解决方法是给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)
    

    【讨论】:

      猜你喜欢
      • 2019-11-27
      • 1970-01-01
      • 2013-12-15
      • 2012-11-26
      • 2016-08-16
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 2019-06-18
      相关资源
      最近更新 更多