在pyqt5 GUI中从qtablewidget和图创建pdf报告

问题描述

enter image description here

我有一个PyQt5 GUI,可以在其中从数据库中检索数据,并将其插入到多个表格小部件中并制作绘图小部件。我想用这些小部件(表格和图表)的内容制作一个PDF报告。在PyQt5中最有效的方法是什么?

我正在使用以下功能,但是输出质量不好。另外,如何设置pdf中小部件的自定义大小?

下面是MRE。

import sys
from PyQt5 import QtGui,QtCore,QtWidgets,QtPrintSupport
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *

class Window(QWidget):
    def __init__(self,rows,columns):
        QWidget.__init__(self)
        self.table = QTableWidget(rows,columns,self)

        self.table.setSpan(0,1,5)
        self.table.setItem(0,QTableWidgetItem("Master Title"))

        self.table.setSpan(1,3)
        self.table.setItem(1,QTableWidgetItem("Title 1"))
        self.table.item(1,0).setTextAlignment(Qt.AlignCenter)

        self.table.setSpan(2,2,2)
        self.table.setItem(2,QTableWidgetItem("Merge 2x2"))
        self.table.item(2,0).setTextAlignment(Qt.AlignCenter)

        for column in range(columns - 1):
            for row in range(4,rows - 1):
                item = QTableWidgetItem('Text%d' % row)
                self.table.setItem(row,column,item)

        layout = QVBoxLayout(self)
        layout.addWidget(self.table)

        self.handleSave(self.table,'table1')

    def handleSave(self,widget,filename):
        printer = QtPrintSupport.QPrinter(QtPrintSupport.QPrinter.HighResolution)
        printer.setPageSize(QtPrintSupport.QPrinter.A6)
        printer.setColorMode(QtPrintSupport.QPrinter.Color)
        printer.setoutputFormat(QtPrintSupport.QPrinter.PdfFormat)
        printer.setoutputFileName(filename + '.pdf')
        pixmap = QtWidgets.QWidget.grab(widget).scaled(
            printer.pageRect(QtPrintSupport.QPrinter.DevicePixel).size().toSize(),QtCore.Qt.KeepAspectRatio)
        painter = QtGui.QPainter(printer)
        painter.drawpixmap(0,pixmap)
        painter.end()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window(10,5)
    window.resize(640,480)
    window.show()
    sys.exit(app.exec_())

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)