我正在尝试遵循有关打印QWidet的文档,但出现错误。当我运行以下代码时,我得到了QPaintDevice: Cannot destroy paint device that is being painted。
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))
用于优化的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