想要在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實例,并將其設置為顯示我們繪圖的圖片。