代码之家  ›  专栏  ›  技术社区  ›  user1050619

Pyqt4鼠标释放事件不起作用

  •  1
  • user1050619  · 技术社区  · 7 年前

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

    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_())
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   eyllanesc    7 年前

    在qt中,事件从父代传递给子代,而不是从父代传递给子代。在你的情况下 mousePressEvent 在小部件中启动,然后可以移动到 QPushButton QGraphicsView ,假设在这种情况下 Q图形视图 然后它发生在您的子窗口小部件上,称为 viewport() ,此操作将在某个小部件接受事件之前完成,同样的情况也必须发生在 mouseReleaseEvent ,但对于要接收 释放事件 一定是接受了 鼠标压力 事件,唯一这样做的是 VIEW() 属于 Q图形视图 . 解决方案是在 VIEW() 属于 Q图形视图 如下所示。

    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)