前言:
本文主要给出了如何将matplotlib绘制的图形嵌入pyqt界面UI中,并显示NavigationToolbar工具条。
最近在开发一个小工具,主要是用作离散元计算结果可视化。GUI是pyqt5,嵌入matplotlib。目前是业余编程,写博客记录一下遇到的问题,大家仅供参考。
实例:
import matplotlib
from PyQt5.QtWidgets import QWidget
matplotlib.use("Qt5Agg") # 声明使用pyqt5
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg # pyqt5的画布
from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
from PyQt5 import QtWidgets
class MatplotlibFigure(FigureCanvasQTAgg):
"""
创建一个画布类,并把画布放到FigureCanvasQTAgg
"""
def __init__(self,parent=None,width=5,height=4,dpi=200):
"""
:param parent:
:param width:
:param height:
:param dpi:
"""
self.figs = Figure(figsize=(width,height),dpi=dpi)
super(MatplotlibFigure, self).__init__(self.figs)#在父类中激活self.fig
self.setParent(parent)
self.axes = self.figs.add_subplot(111)
self.axes.patch.set_alpha(0.5) # 设置ax区域背景颜色透明度
FigureCanvasQTAgg.setSizePolicy(self,QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
# 用于告知包含该widget的layout:该widget的size hint已发生变化,layout会自动进行调整。
FigureCanvasQTAgg.updateGeometry(self)
class MplWidget(QWidget):
def __init__(self, parent=None):
"""
:param parent:
"""
QWidget.__init__(self, parent)
self.qCanvas = MatplotlibFigure(parent)
self.mpl_toolbar = NavigationToolbar(self.qCanvas, self) # 创建工具条
# 创建布局,把画布类组件对象和工具条对象添加到QWidget控件中
self.vbl = QtWidgets.QVBoxLayout()
self.vbl.addWidget(self.qCanvas)
self.vbl.addWidget(self.mpl_toolbar)
self.setLayout(self.vbl)
注意:
不能出现下面这种写法,会造成了对父类变量的覆盖。
self.width = width
self.heigh = heigh
self.dpi = dpi