Apr-01-2022, 12:09 PM
You could integrate the NavigationToolbar as a (movable) QToolbar
import sys
import matplotlib
matplotlib.use('Qt5Agg')
from PyQt5 import QtCore, QtGui, QtWidgets
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)
sc = MplCanvas(self, width=5, height=4, dpi=100)
sc.axes.plot([0,1,2,3,4], [10,1,20,3,40])
# Create toolbar, passing canvas as first parament, parent (self, the MainWindow) as second.
self.t_bar = self.addToolBar("File")
self.t_bar.setContextMenuPolicy(QtCore.Qt.PreventContextMenu)
self.t_bar.setMovable(False)
self.t_bar.setAllowedAreas(QtCore.Qt.TopToolBarArea)
self.action_one = QtWidgets.QAction(self.style().standardIcon(QtWidgets.QStyle.SP_DirOpenIcon),
"One", triggered = self.on_action_one)
self.t_bar.addAction(self.action_one)
self.action_two = QtWidgets.QAction(self.style().standardIcon(QtWidgets.QStyle.SP_DriveNetIcon),
"Two", triggered = self.on_action_two)
self.t_bar.addAction(self.action_two)
self.addToolBarBreak()
self.sc_bar = self.addToolBar("SC")
self.sc_bar.addWidget(NavigationToolbar(sc, None))
layout = QtWidgets.QVBoxLayout()
layout.addWidget(sc)
# Create a placeholder widget to hold our toolbar and canvas.
widget = QtWidgets.QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
self.show()
def on_action_one(self):
print("on_action_one")
def on_action_two(self):
print("on_action_two")
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
app.exec_()
