使用grab()方法时如何提高QWidget的分辨率

问题描述 投票:-1回答:1

我正在尝试获取窗口小部件的屏幕快照,在本示例中为QPushButton。

对于我正在使用的grab()方法,问题在于,当尝试增加捕获的图像的大小时,它看起来模糊了

示例:enter image description here

如何通过增加捕获的大小来提高小部件的分辨率?

from PyQt5.QtWidgets import QDialog,QApplication,QPushButton
from PyQt5 import QtCore,QtPrintSupport,QtGui
from PyQt5 import uic

class Teacher(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        #uic.loadUi("gui/Teacher.ui",self)

        #self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
        #self.Cerrar.clicked.connect(lambda:self.close())

        self.Button = QPushButton(self)
        self.Button.setText("Press")
        self.Button.resize(60,40)
        self.Button.clicked.connect(lambda:self.Document())

        self.Rute = "C:\\Users\\Dell\\Desktop"

        #self.Print.clicked.connect(lambda:self.Document())

    def Document(self):
        #Name = str(QtCore.QDate.currentDate().toPyDate())
        Printer = QtPrintSupport.QPrinter()
        Printer.setOutputFormat(QtPrintSupport.QPrinter.PdfFormat)
        Printer.setOutputFileName(self.Rute+"\\"+"Name1"+".pdf")
        Printer.setFullPage(True)

        Painter = QtGui.QPainter()
        Painter.begin(Printer)
        Widget = self.Button.grab()
        Painter.setRenderHint(QtGui.QPainter.SmoothPixmapTransform)
        Painter.drawPixmap(10,10,500,500,Widget)
        Painter.end()


app = QApplication([])
f = Teacher()
f.show()
app.exec_()
pyqt pyqt5
1个回答
0
投票

首先,简单地说,您不应该这样做。实际上,大多数小部件内部都使用像素图来绘制其内容,无论您尝试做什么,都将最终得到像素化的内容。

除了小部件“样式”的像素图内容之外,您无法通过grab()实现该功能,因为它可以在屏幕分辨率下工作。

唯一可行的选择是将render()(考虑将要渲染的[[paint device)与QImage一起使用,该QImage可以进行设置。

render()
如您所见,结果是“混合”的:

class Teacher(QDialog): def __init__(self): QDialog.__init__(self) layout = QVBoxLayout(self) self.button = QPushButton(self) self.button.setText("Press") self.button.resize(60,40) self.button.clicked.connect(self.document) layout.addWidget(self.button) self.path = QtCore.QDir("/tmp") def document(self): printer = QtPrintSupport.QPrinter() printer.setOutputFormat(QtPrintSupport.QPrinter.PdfFormat) printer.setOutputFileName(self.path.absoluteFilePath("Name1.pdf")) printer.setFullPage(True) ratio = 5 size = self.button.size() image = QtGui.QImage(size.width() * ratio, size.height() * ratio, QtGui.QImage.Format_ARGB32) image.setDevicePixelRatio(ratio) self.button.render(image) painter = QtGui.QPainter(printer) painter.scale(ratio, ratio) painter.drawImage(0, 0, image) painter.end()

虽然正确绘制了文本,但按钮的边框却没有,这是由于样式用于绘制小部件的上述像素图内容。

一种解决方案是自己绘制

all

小部件(通过子类化要绘制的每个小部件并覆盖它们的paintEvent方法),但是对于复杂的小部件(例如列表视图),这可能很难[[very 。“中途”是为整个应用程序使用自定义样式表,但这不是一件容易的事:复杂的小部件需要您提供whole css样式(这种情况是滚动区域(例如项目视图),您还必须为其提供滚动条的[[every元素样式)。显然,这也意味着您将获得一个程序,该程序not在图形上与您的操作系统保持一致。rendering result with pixelated borders另一方面,即使在大比例尺上,您也会得到几乎完美绘制的小部件:app = QApplication([]) app.setStyleSheet(''' QPushButton { border: 1px solid darkGray; padding: 5px; border-radius: 4px; min-width: 80px; } QPushButton:hover{ border-style: outset; } QPushButton:pressed { border-style: inset; } ''' PS:我对您的代码进行了一些更改,主要是使用小写的对象名称和功能,如PEP8样式指南所建议的,对于这些名称,大写的名称应仅用于类名称(并且也被视为惯例,尤其是在Q&A网站上,例如StackOverflow)。
© www.soinside.com 2019 - 2024. All rights reserved.