Matplotlib 事件处理:他们什么时候发送 matplotlib 事件,什么时候发送 Qt 事件

Matplotlib event handling: when do they send matplotlib events and when Qt events

我正在尝试使用 Pyside2 将 matplotlib 嵌入到 Qt 界面中。我想使用 'imshow' 来显示我可以使用滚轮放大并单击的图像。要连接滚轮和鼠标,我使用:

self.fig.canvas.mpl_connect('button_press_event', self.mouseClick)
self.fig.canvas.mpl_connect('scroll_event', self.wheelEvent)

如果我使用的事件处理程序:

def wheelEvent(self, event):
    print(event)

def mouseClick(self, event):
    print(event)

当我 运行 这个,然后滚动并点击时,我得到的输出是:

button_press_event: xy=(94, 199) xydata=(99.99197230814553, 134.93602887023127) button=1 dblclick=False inaxes=AxesSubplot(0.125,0.290018;0.775x0.409964)
<PySide2.QtGui.QWheelEvent object at 0x7f92e3359a50>

所以我的问题是,为什么在一种情况下我得到一个 PySide 事件而在另一种情况下我得到一个 matplotlib button_press_event?我期待的是得到 scroll_event.

非常感谢!

解释:

wheelEvent 是 QWidget class 的一种方法,当 window 通过 QWheelEvent 获得焦点并因此 classes 时,每次与滚轮交互时都会收到通知从它继承的也会有它,在这种情况下,它们会覆盖该方法,并且您还将它连接到 scroll_event 事件,因此打印 QWheelEvent(在我的情况下,Linux 上的 PySide2 5.14 我收到 QWheelEvent和 scroll_event 交替)。

解决方案:

不要使用 wheelEvent 方法,而是使用另一个名称不同的方法:

self.fig.canvas.mpl_connect('button_press_event', self.mouseClick)
self.fig.canvas.mpl_connect('scroll_event', <b>self.mouseWheel</b>)</pre>

def <b>mouseWheel</b>(self, event):
    print(event)

def mouseClick(self, event):
    print(event)