如何将matplotlib导航功能集成到PyQt5主窗口自定义工具栏
PyQt5 内置工具栏集成Matplotlib交互功能实现
核心逻辑
你不需要显示Matplotlib自带的NavigationToolbar组件,只需要在后台实例化该对象,其内置的所有交互方法都可以直接调用,绑定到你自定义的QAction上即可,不用重写交互逻辑。
完整实现代码
import sys import matplotlib matplotlib.use('Qt5Agg') from PyQt5.QtWidgets import QToolBar, QMainWindow, QAction, qApp, QApplication from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtGui import QIcon from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar from matplotlib.figure import Figure class MplCanvas(FigureCanvasQTAgg): def __init__(self, parent=None, width=5, height=4, dpi=100): fig = Figure(figsize=(width, height), dpi=dpi) self.axes = fig.add_subplot(111) super(MplCanvas, self).__init__(fig) class MainWindow(QtWidgets.QMainWindow): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) self.resize(800, 600) # 1. 初始化画布 self.sc = MplCanvas(self, width=5, height=4, dpi=100) self.sc.axes.plot([0,1,2,3,4], [10,1,20,3,40]) # 2. 后台实例化导航工具栏,不要添加到布局里,自然就不会显示 self.mpl_toolbar = NavigationToolbar(self.sc, self) # 3. 自定义PyQt工具栏,添加所有需要的交互操作 self.custom_toolbar = self.addToolBar('绘图工具') # 回到初始视图 home_act = QAction(QIcon('home.png'), '回到初始视图', self) home_act.setShortcut('Ctrl+H') home_act.triggered.connect(self.home) self.custom_toolbar.addAction(home_act) # 后退到上一个视图 back_act = QAction(QIcon('back.png'), '后退', self) back_act.setShortcut('Ctrl+Left') back_act.triggered.connect(self.back_to_previous_view) self.custom_toolbar.addAction(back_act) # 前进到下一个视图 forward_act = QAction(QIcon('forward.png'), '前进', self) forward_act.setShortcut('Ctrl+Right') forward_act.triggered.connect(self.forward_to_next_view) self.custom_toolbar.addAction(forward_act) # 平移 pan_act = QAction(QIcon('pan.png'), '平移', self) pan_act.setShortcut('Ctrl+P') pan_act.triggered.connect(self.left_button_pan) self.custom_toolbar.addAction(pan_act) # 框选缩放 zoom_act = QAction(QIcon('zoom.png'), '缩放', self) zoom_act.setShortcut('Ctrl+Z') zoom_act.triggered.connect(self.zoom) self.custom_toolbar.addAction(zoom_act) # 调整子图参数 subplot_act = QAction(QIcon('subplot.png'), '调整子图', self) subplot_act.setShortcut('Ctrl+S') subplot_act.triggered.connect(self.configure_subplots) self.custom_toolbar.addAction(subplot_act) # 编辑坐标轴参数 axis_act = QAction(QIcon('axis.png'), '编辑坐标轴', self) axis_act.setShortcut('Ctrl+E') axis_act.triggered.connect(self.edit_axis) self.custom_toolbar.addAction(axis_act) # 保存图片 save_act = QAction(QIcon('save.png'), '保存', self) save_act.setShortcut('Ctrl+Shift+S') save_act.triggered.connect(self.save_figure) self.custom_toolbar.addAction(save_act) # 布局只加画布即可,不需要加matplotlib自带的工具栏 layout = QtWidgets.QVBoxLayout() layout.addWidget(self.sc) widget = QtWidgets.QWidget() widget.setLayout(layout) self.setCentralWidget(widget) self.show() # 各个功能直接调用后台导航栏的内置方法即可 def home(self): self.mpl_toolbar.home() def back_to_previous_view(self): self.mpl_toolbar.back() def forward_to_next_view(self): self.mpl_toolbar.forward() def left_button_pan(self): self.mpl_toolbar.pan() def zoom(self): self.mpl_toolbar.zoom() def configure_subplots(self): self.mpl_toolbar.configure_subplots() def edit_axis(self): self.mpl_toolbar.edit_parameters() def save_figure(self): self.mpl_toolbar.save_figure() if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) w = MainWindow() sys.exit(app.exec_())
注意事项
- 代码里的图标路径可以替换为你自己本地的图标文件路径,如果不需要图标可以去掉QIcon参数
- 快捷键和操作名称可以根据自己的需求修改
- 不需要的功能可以直接删掉对应的Action和方法即可
内容的提问来源于stack exchange,提问作者zezo
相关产品推荐
相关产品推荐

