如您所见,画布不是由Qt处理,而是由matplotlib处理,因此解决方案是使用该库提供的事件,如果您查看文档,会发现存在以下事件:
事件名称 类别和描述
'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
在您的情况下,您应该使用以下事件:
- button_press_event
- button_release_event
- motion_notify_event
例:
from PyQt5 import QtWidgetsfrom matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvasfrom matplotlib.figure import Figureclass 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_())


