我需要能够以PS或类似的文件格式保存pyqt应用程序的主窗口,以便我可以将其发送到打印机。我只是制作一个内置的屏幕截图功能,但我的主窗口超出了我的屏幕大小。任何人都知道一种完全捕获窗口的方法,或者是否有预先构建的类可以执行此操作?
答案 0 :(得分:3)
QPixmap具有静态方法grabWidget。
在您的窗口指向此方法将为您提供一个像素图,您可以将其保存到文件或用于打印。
如果从主窗口类中调用:
sshot = QPixmap.grabWidget(self)
sshot.save('sshot.png')
答案 1 :(得分:0)
QPixmap.grabWiget已被弃用。我们可以改为使用QWidget.grab()函数来捕获窗口。但是,它仅捕获屏幕上当前可见的部分,如果您的窗口带有滚动区域,则可能会出现问题。因此,对我而言唯一有效的方法/技巧是使用ScrollArea的页面步进功能与小部件抓取配对。
# Get total pages in window
page_count = self.scrollArea.verticalScrollBar().maximum() / self.scrollArea.verticalScrollBar().pageStep()
image_list = []
# iterate through each page step
for i in range(int(round(page_count)) + 1):
step = self.scrollArea.verticalScrollBar().pageStep() * i
self.scrollArea.verticalScrollBar().setValue(step)
# capture and save each image
self.scrollArea.grab().save(f"page - {i}.jpg", quality=100)
# convert all images to Pillow Image() to later convert to pdf
image_list.append(Image.open(f"report_page - {i}.jpg"))
# save as pdf file
pdf_file_name = f'pdf_file.pdf'
image_list[0].save(pdf_file_name, "PDF", resolution=100.0, save_all=True, append_images=image_list[1:])
# delete images if not neccessary
for i in range(len(image_list)):
os.unlink(f"page - {i}.jpg")
P.s。请让我知道是否有解决此问题的更优雅的方法