【问题标题】:Python PyQt4 creating pdf from qlayoutPython PyQt4 从 qlayout 创建 pdf
【发布时间】:2017-01-26 09:43:37
【问题描述】:

我正在使用 PyQt4 开发一个应用程序。我想有一个选项将主小部件打印到 pdf 文档。我有一个用于主小部件的自定义 qlayout,我想用那个 qlayout 创建一个 pdf 文档。我读了很多关于 pyqt qprinter 的文章,但我不确定这就是我想要的。

谁能建议我如何创建一个带有 qlayout 的 pdf,其中包含 qwidgets?

【问题讨论】:

    标签: python pdf pyqt pyqt4 qlayout


    【解决方案1】:

    使用QPixmap.grabWidget 将小部件呈现为像素图,然后将其绘制在QPrinter 上,然后可以将其转换为pdf:

    import sys
    from PyQt4 import QtCore, QtGui
    
    class Window(QtGui.QWidget):
        def __init__(self):
            super(Window, self).__init__()
            self.text = QtGui.QTextEdit(self)
            self.text.setText(open(__file__).read())
            self.edit = QtGui.QLineEdit(self)
            self.edit.setText('/tmp/test.pdf')
            self.buttonSave = QtGui.QPushButton('Save', self)
            self.buttonSave.clicked.connect(self.handleSave)
            layout = QtGui.QGridLayout(self)
            layout.addWidget(self.text, 0, 0, 1, 2)
            layout.addWidget(self.edit, 1, 0, 1, 1)
            layout.addWidget(self.buttonSave, 1, 1, 1, 1)
    
        def handleSave(self):
            printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution)
            printer.setPageSize(QtGui.QPrinter.A6)
            printer.setColorMode(QtGui.QPrinter.Color)
            printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
            printer.setOutputFileName(self.edit.text())
            pixmap = QtGui.QPixmap.grabWidget(self).scaled(
                printer.pageRect(QtGui.QPrinter.DevicePixel).size().toSize(),
                QtCore.Qt.KeepAspectRatio)
            painter = QtGui.QPainter(printer)
            painter.drawPixmap(0, 0, pixmap)
            painter.end()
    
    if __name__ == '__main__':
    
        app = QtGui.QApplication(sys.argv)
        window = Window()
        window.setGeometry(600, 100, 640, 640)
        window.show()
        sys.exit(app.exec_())
    

    编辑

    如果QPainter 部分在您的设置中由于某种原因无法工作,您可以尝试以下替代保存方法:

        def handleSave(self):
            printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution)
            printer.setPageSize(QtGui.QPrinter.A9)
            printer.setColorMode(QtGui.QPrinter.Color)
            printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
            printer.setOutputFileName(self.edit.text())
            self.render(printer)
    

    或者另一种选择是使用QTextDocument

        def handleSave(self):
            printer = QtGui.QPrinter()
            printer.setPageSize(QtGui.QPrinter.A5)
            printer.setResolution(200)
            printer.setColorMode(QtGui.QPrinter.Color)
            printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
            printer.setOutputFileName(self.edit.text())
            size = printer.pageRect(QtGui.QPrinter.DevicePixel).size()
            pixmap = QtGui.QPixmap.grabWidget(self).scaled(
                size.toSize(), QtCore.Qt.KeepAspectRatio,
                QtCore.Qt.SmoothTransformation)
            data = QtCore.QByteArray()
            buffer = QtCore.QBuffer(data)
            pixmap.save(buffer, 'PNG')
            document = QtGui.QTextDocument()
            document.setPageSize(size)
            document.setHtml('<img src="data:image/png;base64,%s"/>' %
                             bytes(data.toBase64()).decode('ascii'))
            document.print_(printer)
    

    【讨论】:

    • 当我运行你的代码时,它给了我两个错误:QPainter::end: Painter not active, abortedQPainter::begin(): Returned false 你知道如何解决吗?
    • 我什么时候将 qlayout 写入 pdf?
    • @CheynShmuel。该代码非常适合我。您是否以某种方式对其进行了编辑?打印布局是没有意义的,因为它是不可见的。您必须打印设置布局的小部件。
    • 不,我复制粘贴了您的代码,并且 GUI 按预期显示,但保存按钮不起作用。
    • @CheynShmuel。你在哪个平台?你用的是什么版本的 PyQt4 和 Qt4?
    猜你喜欢
    • 2012-01-25
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 2023-03-20
    • 2014-04-16
    相关资源
    最近更新 更多