how to track the mouse over the matplot's canvas in QWidget?

后端 未结 1 1244
无人及你
无人及你 2020-12-11 12:58

I want to track the mouse\'s position over a matplot\'s canvas in real-time.

For now, I built a MplWidget that inherits the Qwidget (act like a container), then bui

相关标签:
1条回答
  • 2020-12-11 13:16

    As you have noticed the canvas is not handled by Qt but by matplotlib so the solution is to use the events provided by that library, if you review the docs you see that there are the following events:

    Event name Class and description

    'button_press_event'  MouseEvent - mouse button is pressed
    'button_release_event'    MouseEvent - mouse button is released
    'draw_event'  DrawEvent - canvas draw (but before screen update)
    'key_press_event' KeyEvent - key is pressed
    'key_release_event'   KeyEvent - key is released
    'motion_notify_event' MouseEvent - mouse motion
    'pick_event'  PickEvent - an object in the canvas is selected
    'resize_event'    ResizeEvent - figure canvas is resized
    'scroll_event'    MouseEvent - mouse scroll wheel is rolled
    'figure_enter_event'  LocationEvent - mouse enters a new figure
    'figure_leave_event'  LocationEvent - mouse leaves a figure
    'axes_enter_event'    LocationEvent - mouse enters a new axes
    'axes_leave_event'    LocationEvent - mouse leaves an axes
    

    In your case you should use the events:

    • button_press_event
    • button_release_event
    • motion_notify_event

    Example:

    from PyQt5 import QtWidgets
    
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.figure import Figure
    
    
    class MplWidget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super(MplWidget, self).__init__(parent)
            self.canvas = FigureCanvas(Figure())
    
            vertical_layout = QtWidgets.QVBoxLayout(self)
            vertical_layout.addWidget(self.canvas)
    
            self.canvas.axes = self.canvas.figure.add_subplot(111)
    
            self.canvas.mpl_connect("button_press_event", self.on_press)
            self.canvas.mpl_connect("button_release_event", self.on_release)
            self.canvas.mpl_connect("motion_notify_event", self.on_move)
    
        def on_press(self, event):
            print("press")
            print("event.xdata", event.xdata)
            print("event.ydata", event.ydata)
            print("event.inaxes", event.inaxes)
            print("x", event.x)
            print("y", event.y)
    
        def on_release(self, event):
            print("release:")
            print("event.xdata", event.xdata)
            print("event.ydata", event.ydata)
            print("event.inaxes", event.inaxes)
            print("x", event.x)
            print("y", event.y)
    
        def on_move(self, event):
            print("move")
            print("event.xdata", event.xdata)
            print("event.ydata", event.ydata)
            print("event.inaxes", event.inaxes)
            print("x", event.x)
            print("y", event.y)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        w = MplWidget()
        w.show()
        sys.exit(app.exec_())
    
    0 讨论(0)
提交回复
热议问题