当前位置: 首页 > 面试题库 >

PyQt打印QWidget

储臻
2023-03-14
问题内容

我正在尝试遵循有关打印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


 类似资料:
  • 问题内容: 我正在尝试在PyQt中打印小部件,但收到“ QPaintDevice:无法销毁正在绘制的绘制设备”的错误。我认为问题是我的方法结束了,因此在绘画者完成绘制像素图之前,qPaintDevice被破坏了。但是,我不知道如何降低画家的速度。 我的方法的代码在这里: 对于它的价值,我尝试使用.begin()和.end()方法,但无济于事。 问题答案: 我发现了我的问题-我忘记了删除画家,这在事

  • 本文向大家介绍使用Python和PyQT -2的打印“ Hello World”,包括了使用Python和PyQT -2的打印“ Hello World”的使用技巧和注意事项,需要的朋友参考一下 介绍 我们可以通过两种方式使用PyQT创建GUI: 纯代码(如果您已跳过该代码,请参阅上一篇文章。) 与QT-designer拖放。 我们将在本文中详细研究第二种方法。在我们飞跃之前,让我们首先熟悉一些技

  • 本文向大家介绍使用Python和PyQT -2的Java打印“ Hello World”(实用),包括了使用Python和PyQT -2的Java打印“ Hello World”(实用)的使用技巧和注意事项,需要的朋友参考一下 第一个GUI程序(QtDesigner) 自从以来,我答应教给您一种更简单的方法。我说的是尽可能简单。让我们将其分为几个步骤: 使用Qtdesigner中的拖放工具设计GU

  • 使用 Photoshop,您可以打印任何兼容的 3D 模型,而无需担心 3D 打印机的限制。在准备打印时,Photoshop 会自动使 3D 模型防水。Photoshop 还会生成必要的支撑结构(支架和底座),以确保您的 3D 打印能够成功完成。 准备打印 3D 对象 选择“窗口”>“工作区”>“3D”以切换到 3D 工作区。 在 Photoshop 中打开 3D 模型。如果需要,请在打开 3D

  • 设置打印方向 - 横向 设置打印方向 - 纵向

  •   最后,我们要给绘图程序增加打印和打印预览功能。我们希望文档分两页打印,第一页为封面,打印文档名字。第二页输出文档内容,并在页眉上打印文档名字。虽然AppWizard已经自动生成了打印和打印预览的代码,但是许多情况下,并不能符合要求。 这是因为: 1.打印机和窗口(屏幕)显示的分辨率不同:打印机的分辨率用每英寸多少个点来描述,屏幕分辨率用单位面积的像素点来表示。对于同样的Arial字体下的一个字