想要在pyqt中显示matplotlib的绘图,在绘图时,其实不必使用以下语句:
matplotlib.use("Qt5Agg") # 声明使用QT5
最关键的语句是:
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
FigureCanvasQTAgg是一个渲染器,它的工作就是不停的drawing,从而将物体显示在屏幕上。
在这里可以理解为将matplotlib中的figure对象变为一个Qt widgets.
QGraphicsView、QGraphicsProxyWidget和QGraphicsScene是Qt中用于实现2D图形界面的重要类。
- QGraphicsView是用于显示场景和处理用户交互的窗口部件
- QGraphicsScene是一个图形场景,它可以容纳和管理大量的2D图形项(QGraphicsItem)
- QGraphicsProxyWidget则是将QWidget封装成为一个QGraphicsItem以便添加到QGraphicsScene中
import sys
from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QGraphicsProxyWidget, QPushButton
import numpy
import matplotlib
import matplotlib.pyplot as plt
# 其中构造函数Figure()用来创建一个类似Matlab的figure()或matplotlib.pyplot的figure()
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg# 自定义绘图类
class MyFigure(FigureCanvasQTAgg): # 表示MyFigure 继承 FigureCanvasQTAgg"""FigureCanvasQTAgg的最终的父类其实是QWidget。"""def __init__(self, parent=None):# 创建一个Figure对象self.fig = Figure(figsize=(10, 6), dpi=72) # 新建一个figure# 在父类中激活Figure,同时继承父类属性# 此句必不可少,否则不能显示图形super(MyFigure,self).__init__(self.fig) # 执行父类的__init__函数,使得我们能够调用父类的init中的属性self.axes = self.fig.add_subplot(111) # 建立一个子图,如果要建立复合图,可以在这里修改# plt.clf() # 每次绘图的时候,清除上一次的绘图# 创造数据numpy.random.seed(1)x = numpy.random.uniform(-3, 3, 256)y = numpy.random.uniform(-3, 3, 256)# 进行绘图self.axes.triplot(x, y)self.axes.set(xlim=(-3, 3), ylim=(-3, 3))self.fig.canvas.draw() if __name__ == "__main__":# 创建了一个QApplication实例app = QApplication(sys.argv)# QGraphicsScene是一个图形场景,它可以容纳和管理大量的2D图形项(QGraphicsItem)# 创建一个QGraphicsScenescene = QGraphicsScene()# 创建了一个QGraphicsView实例# QGraphicsView是用于显示绘图的窗口部件# 在绘图窗口中显示图形场景# 把QGraphicsScene添加到QGraphicsView中显示view = QGraphicsView(scene)# 实例化自定义的绘图myfig = MyFigure()# QGraphicsProxyWidget则是将QWidget封装成为一个QGraphicsItem# 以便添加到QGraphicsScene中proxy = QGraphicsProxyWidget()proxy.setWidget(myfig)""" 以上代码将myfig封装成为一个QGraphicsItem """# 将QGraphicsProxyWidget添加到场景中# 在场景中显示自定义的绘图scene.addItem(proxy)view.show()sys.exit(app.exec_())
以上代码中,首先我们创建了一个QApplication实例和一个QGraphicsScene实例。
然后创建了一个QPushButton实例作为QGraphicsProxyWidget的子控件
接着将自定义的绘图,封装成一个QGraphicsProxyWidget,并将其添加到场景QGraphicsScene中。
最后,我们创建了一个QGraphicsView实例,并将其设置为显示我们绘图的图片。