当用pyqt结合matplotlib,开发桌面程序的时候,想要在曲线图上添加一些鼠标操作,例如:鼠标滚轮滑动,点击等。这时因为作图区域覆盖在部件上面,所以会拦截鼠标事件。qt无法获取到鼠标事件。
# 创建Matplotlib图形
self.fig = Figure(figsize=(8.5, 7))
self.canvas = FigureCanvas(self.fig)
self.canvas.mpl_connect('scroll_event', self.canvas_wheelEvent)
def canvas_wheelEvent(self, event):
print(type(event))
print('图表', event)
当在鼠标在图表区域做操作时,canvas_wheelEvent 会拦截操作事件
当有需求要qt窗口处理该事件的时候,需要把事件对象传递给 QWidget
def canvas_wheelEvent(self, event):
print(type(event))
print('图表', event)
print(event.guiEvent)
self.wheelEvent(event.guiEvent)
其中 wheelEvent 为qt的鼠标滚轮事件函数,接受的参数类型为 wheelEvent(self, a0: QWheelEvent) QWheelEvent类型,
而 matplotlib 的鼠标事件为MouseEvent
<class 'matplotlib.backend_bases.MouseEvent'>
所以需要把事件转成qt识别的 UI事件类型 event.guiEvent再传递给qt事件处理函数。
<PyQt6.QtGui.QWheelEvent object at 0x000001AE8A175408>
这样就可以直接在绘图上进行一些窗口应用的的常用操作。