在python中定义MatplotlibImageProvider类,首先,您需要将 matplotlib 图表转换为 QImage。幸运的是,这样做非常容易。matplotlib 的规范后端(渲染器)是 *Agg’,它允许您将 Figure 渲染到内存中。只需为您的 Figure制作一个合适的 Canvas 对象,然后调用 .draw()。QImage 构造函数将直接将生成的数据作为输入。
from PySide6.QtGui import QImage
from PySide6.QtQml import QQmlImageProviderBase
from PySide6.QtQuick import QQuickImageProvider
from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg
class MatplotlibImageProvider(QQuickImageProvider):
figures = dict()
def __init__(self):
QQuickImageProvider.__init__(self, QQmlImageProviderBase.Image)
def addFigure(self, name, **kwargs):
figure = Figure(**kwargs)
self.figures[name] = figure
return figure
def getFigure(self, name):
return self.figures.get(name, None)
def requestImage(self, p_str,w,h):
figure = self.getFigure(p_str)
if figure is None:
return QQuickImageProvider.requestImage(self, p_str,w,h)
canvas = FigureCanvasAgg(figure)
canvas.draw()
w, h = canvas.get_width_height()
img = QImage(canvas.buffer_rgba(), w, h,QImage.Format_RGBA8888).copy()
return img
每当我需要用python代码绘制绘图时,我只需使用此addFigure创建Figure来为其命名,并让Qt知道它。一旦你得到了Figure,matplotlib绘图的其余部分就会像往常一样发生。制作轴和绘图。请注意,URL以“image://”为前缀,以告诉QML我们需要从QQuickImageProvider获取图像,并包含要使用的特定提供程序的名称(“perflog”)。为了使这些东西正常工作,我们需要在QML初始化期间通过调用addImageProvider来注册我们的提供程序。例如
imageprovider = MatplotlibImageProvider()
engine.addImageProvider('perflog',imageprovider)
figure = imageProvider.addFigure("eventStatisticsPlot", figsize=(10,10))
ax = figure.add_subplot(111)
ax.plot(x,y)
然后在QML代码中,我可以简单地按名称引用matplotlib图像(“eventStatisticsPlot”)
Image{
width: 510
height: 504
source:"image://perflog/eventStatisticsPlot"
fillMode: Image.PreserveAspectFit
}