python - PyQt 打印 QWidget
问题描述
我正在尝试按照文档打印 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))
解决方案
用于优化的 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
推荐阅读
- javascript - 从 json 获取值到数据表时出错
- bash - 为 bash 脚本提供接受标志(如命令)的选项
- java - 将 JSON 转换为具有 Json 属性的 POJO 作为具有不同属性的 jsonObject
- rust - 返回一个闭包,返回 Rust 中的函数参数
- javascript - 使用 ajax 或 javascript 时如何防止重复提交?
- arrays - 无法从 Stack1 类的参数化构造函数初始化数组大小......但如果我直接将整数值提供给数组代码工作正常
- parsing - 已解析项目的 FParsec 和后缀修饰符
- nginx - 使用 proxy_pass 为 NGINX 上的图像设置浏览器缓存
- python - Python中的selenium webdriver中的线程
- angular - 减小 Angular 7 应用程序的 NGRX 商店的大小