在PyQt中打印主窗口

问题描述 投票:0回答:2

我需要能够以PS或类似文件格式保存pyqt应用程序的主窗口,以便可以将其发送到打印机。我只想做一个内置的屏幕截图功能,但是我的主窗口超过了屏幕的大小。任何人都知道一种完整捕获窗口的方法,还是有预建的类可以做到这一点?

python pyqt
2个回答
3
投票

QPixmap具有静态方法grabWidget

将此方法指向您的窗口将为您提供一个像素图,您可以将其保存到文件或用于打印。

如果从主窗口类内部调用:

sshot = QPixmap.grabWidget(self)
sshot.save('sshot.png')

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。请让我知道是否有解决此问题的更优雅的方法

© www.soinside.com 2019 - 2024. All rights reserved.