Matplotlib 事件处理:他们何时发送 matplotlib 事件以及何时发送 Qt 事件

Posted

技术标签:

【中文标题】Matplotlib 事件处理:他们何时发送 matplotlib 事件以及何时发送 Qt 事件【英文标题】:Matplotlib event handling: when do they send matplotlib events and when Qt events 【发布时间】:2020-01-02 04:15:43 【问题描述】:

我正在尝试使用 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

非常感谢!

【问题讨论】:

【参考方案1】:

说明:

wheelEvent 是 QWidget 类的一个方法,当窗口通过 QWheelEvent 获得焦点时,它每次与***交互时都会收到通知,因此从它继承的类也将拥有它,在这种情况下,它们会覆盖它方法,并且您还将它连接到 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', self.mouseWheel)
def mouseWheel(self, event):
    print(event)

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

【讨论】:

谢谢!我要花 1e6 年才能弄清楚……

以上是关于Matplotlib 事件处理:他们何时发送 matplotlib 事件以及何时发送 Qt 事件的主要内容,如果未能解决你的问题,请参考以下文章

iBeacon:何时向服务器发送信标事件

将事件处理程序附加到在循环内创建的表单

Python-Matplotlib可视化(番外篇)——Matplotlib中的事件处理详解与实战

是否必须以不同的方式处理键盘事件才能在 Matplotlib/PyQt5 中选择事件? [复制]

无法让 matplotlib 事件处理程序与 Boost.Python 一起使用

为啥以及何时需要在 React 中绑定函数和事件处理程序?