PyQt print QWidget - PullRequest
       53

PyQt print QWidget

2 голосов
/ 02 ноября 2019

Я пытаюсь следовать документации для печати QWidet и получаю ошибку. Когда я запускаю следующий код, я получаю QPaintDevice: Cannot destroy paint device that is being painted.

import sys
from PyQt4 import QtGui, QtCore

class SampleApp(QtGui.QDialog):
    def __init__(self):
        super().__init__()

        layout = QtGui.QVBoxLayout()
        self.setLayout(layout)

        text_editor = QtGui.QTextEdit()
        layout.addWidget(text_editor)

        button = QtGui.QPushButton("Print")
        layout.addWidget(button)
        button.clicked.connect(self.print_me)

    def print_me(self):
        printer = QtGui.QPrinter()
        printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
        printer.setOutputFileName("Test.pdf")

        self.painter = QtGui.QPainter(printer)
        margins = printer.getPageMargins(QtGui.QPrinter.DevicePixel)
        xscale = (printer.pageRect().width() - margins[0]) / self.width()
        yscale = (printer.pageRect().height() - margins[1]) / self.height()
        scale = min(xscale, yscale)
        self.painter.scale(scale, scale)

        self.render(self.painter)

app = QtGui.QApplication(sys.argv)
ex = SampleApp()
ex.show()
sys.exit(app.exec_())

Если я изменю метод print_me () на следующий, он, тем не менее, работает (я просто теряю всю способность масштабировать рисователькурс):

def print_me(self):
    printer = QtGui.QPrinter()
    printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
    printer.setOutputFileName("Test.pdf")

    self.render(QtGui.QPainter(printer))

1 Ответ

1 голос
/ 02 ноября 2019

QPainter для оптимизации не применяет все задачи одновременно, но сохраняет инструкции и применяет их в конце, но для принудительного выполнения этой задачи лучше вызвать метод end () или удалить его, так как разрушитель также вызываетend (), кроме того, QPainter не обязательно должен быть членом класса:

def print_me(self):
    printer = QtGui.QPrinter()
    printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
    printer.setOutputFileName("Test.pdf")

    painter = QtGui.QPainter(printer)
    xscale = printer.pageRect().width() / self.width()
    yscale = printer.pageRect().height() / self.height()
    scale = min(xscale, yscale)
    painter.translate(printer.paperRect().center())
    painter.scale(scale, scale)
    painter.translate((self.width() / 2) * -1, (self.height() / 2) * -1)

    self.render(painter)
    painter.end()
    # or
    # del painter
...