Why mouseMoveEvent does nothing in PyQt5

10,120

Solution 1

Firstly, you must enable mouse-tracking:

        self.graphicsView.setMouseTracking(True)

Then you can either use a subclass of QGraphicsView:

class GraphicsView(QtWidgets.QGraphicsView):   
    def mouseMoveEvent(self, event):
        if event.buttons() == QtCore.Qt.NoButton:
            print("Simple mouse motion")
        elif event.buttons() == QtCore.Qt.LeftButton:
            print("Left click drag")
        elif event.buttons() == QtCore.Qt.RightButton:
            print("Right click drag")
        super(GraphicsView, self).mouseMoveEvent(event)

    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            print("Press!")
        super(GraphicsView, self).mousePressEvent(event)

Or install an event-filter:

        self.graphicsView.viewport().installEventFilter(self)
        ...

    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.MouseMove:
            if event.buttons() == QtCore.Qt.NoButton:
                print("Simple mouse motion")
            elif event.buttons() == QtCore.Qt.LeftButton:
                print("Left click drag")
            elif event.buttons() == QtCore.Qt.RightButton:
                print("Right click drag")
        elif event.type() == QtCore.QEvent.MouseButtonPress:
            if event.button() == QtCore.Qt.LeftButton:
                print("Press!")
        return super(Window, self).eventFilter(source, event)

Solution 2

I am sure that your events is handled inside QGraphicsView. You have to read more about event propagation. Try it without adding any additional widgets on top of Window. And do not forget abt MouseTracking property, which is false by default and mouse move events without buttons do not happend at all.

I would recomend to read this article. It's is quite old, but still relevant. Also mouse events in QGraphicsView handled in a different way, read docs for more details.

Sory no code samples since I am C++ developer.

Share:
10,120
Philokey
Author by

Philokey

CS student

Updated on August 07, 2022

Comments

  • Philokey
    Philokey over 1 year

    I try to use mouseMoveEvent and mousePressEvent in PyQt5 and Python3.5, but there is nothing when I click my mouse. My code is as following, is there something wrong?

    from PyQt5 import QtWidgets, QtGui, QtCore
    
    class Window(QtWidgets.QMainWindow):
        def __init__(self):
            QtWidgets.QMainWindow.__init__(self)
            widget = QtWidgets.QWidget(self)
            layout = QtWidgets.QVBoxLayout(widget)
            self.graphicsView = QtWidgets.QGraphicsView()
            self.graphicsView.setCursor(QtCore.Qt.CrossCursor)
            self.graphicsView.setObjectName("graphicsView")
            layout.addWidget(self.graphicsView)
            self.setCentralWidget(widget)
    
        def mouseMoveEvent(self, event):
            if event.buttons() == QtCore.Qt.NoButton:
                print("Simple mouse motion")
            elif event.buttons() == QtCore.Qt.LeftButton:
                print("Left click drag")
            elif event.buttons() == QtCore.Qt.RightButton:
                print("Right click drag")
    
        def mousePressEvent(self, event):
            if event.button() == QtCore.Qt.LeftButton:
                print("Press!")
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        win = Window()
        win.show()
        sys.exit(app.exec_())