我正在尝试获取窗口小部件的屏幕快照,在本示例中为QPushButton。
对于我正在使用的grab()方法,问题在于,当尝试增加捕获的图像的大小时,它看起来模糊了
如何通过增加捕获的大小来提高小部件的分辨率?
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_()
首先,简单地说,您不应该这样做。实际上,大多数小部件内部都使用像素图来绘制其内容,无论您尝试做什么,都将最终得到像素化的内容。
除了小部件“样式”的像素图内容之外,您无法通过grab()
实现该功能,因为它可以在屏幕分辨率下工作。
唯一可行的选择是将render()
(考虑将要渲染的[[paint device)与QImage一起使用,该QImage可以进行设置。
render()
如您所见,结果是“混合”的:小部件(通过子类化要绘制的每个小部件并覆盖它们的paintEvent方法),但是对于复杂的小部件(例如列表视图),这可能很难[[very 。“中途”是为整个应用程序使用自定义样式表,但这不是一件容易的事:复杂的小部件需要您提供whole css样式(这种情况是滚动区域(例如项目视图),您还必须为其提供滚动条的[[every元素样式)。显然,这也意味着您将获得一个程序,该程序not在图形上与您的操作系统保持一致。另一方面,即使在大比例尺上,您也会得到几乎完美绘制的小部件:
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
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)。