将Matplotlib图形画布图像插入到QTextDocument中

3
我正在创建一个应用程序,该应用程序可以自动计算成绩并分配等级字母。在应用程序中,使用Matplotlib创建图表。我想将QTableView和图表包含在QTextDocument中以进行打印。我知道如何插入QTableView,但不知道如何在表格后插入图表。

enter image description here

这个可以直接实现,还是需要先将图像保存到磁盘上?
1个回答

4

您需要将画布转换为QImage,然后将其作为资源添加到QTextDocument中。

import sys
import time
import uuid

import numpy as np

from matplotlib.backends.qt_compat import QtCore, QtGui, QtWidgets
from matplotlib.backends.backend_qt5agg import FigureCanvas
from matplotlib.figure import Figure


class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self._main = QtWidgets.QWidget()
        self.setCentralWidget(self._main)

        layout = QtWidgets.QVBoxLayout(self._main)

        static_canvas = FigureCanvas(Figure(figsize=(5, 3)))
        layout.addWidget(static_canvas)
        static_canvas.setFixedHeight(200)

        self._static_ax = static_canvas.figure.subplots()
        t = np.linspace(0, 10, 501)
        self._static_ax.plot(t, np.tan(t), "r.")

        self.textedit = QtWidgets.QTextEdit()
        button = QtWidgets.QPushButton("Add Canvas")
        button.clicked.connect(self.add_image)
        layout.addWidget(button, stretch=0)
        layout.addWidget(self.textedit, stretch=1)

    def add_image(self):
        document = self.textedit.document()

        img = self.canvasToQImage(self._static_ax.figure.canvas)
        url = QtCore.QUrl()
        url.setScheme("mydata")
        url.setHost("image-{uuid}.png".format(uuid=uuid.uuid4()))
        document.addResource(QtGui.QTextDocument.ImageResource, url, img)

        # add image
        cursor = QtGui.QTextCursor(document)
        imageFormat = QtGui.QTextImageFormat()
        imageFormat.setName(url.toString())
        cursor.insertImage(imageFormat)

        # or
        # self.textedit.append('<img src="{url}" />'.format(url=url.toString()))

    @staticmethod
    def canvasToQImage(canvas):
        data = canvas.buffer_rgba()
        ch = 4
        w, h = canvas.get_width_height()
        bytesPerLine = ch * w
        img = QtGui.QImage(data, w, h, bytesPerLine, QtGui.QImage.Format_ARGB32)
        return img.rgbSwapped()


if __name__ == "__main__":
    qapp = QtWidgets.QApplication(sys.argv)
    app = ApplicationWindow()
    app.resize(640, 480)
    app.show()
    qapp.exec_()

非常感谢。我刚刚测试了你的方法,但是它给了我这个错误:AttributeError: type object 'QUuid' has no attribute 'Id128' - Khalil Al Hooti
1
@KhalilAlHooti 看起来 pyqt5 的版本没有那个模块,不管怎样我只是用 uuid 来创建随机文本,现在用标准 Python 库的 uuid 模块替换它。 - eyllanesc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接