【问题标题】:Insert matplotlib figure canvas image into QTextDocument将 matplotlib 图形画布图像插入 QTextDocument
【发布时间】:2020-05-05 09:41:18
【问题描述】:

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

这是直接可以还是应该先把图片存盘?

【问题讨论】:

    标签: python matplotlib pyqt pyqt5


    【解决方案1】:

    您必须将画布转换为 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'
    • @KhalilAlHooti 好像pyqt5的版本没有那个模块,反正我只用uuid创建随机文本,现在换成标准python库的uuid模块。
    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2015-01-01
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多