在PyQt中打印主窗口

时间:2011-04-04 13:48:34

标签: python pyqt

我需要能够以PS或类似的文件格式保存pyqt应用程序的主窗口,以便我可以将其发送到打印机。我只是制作一个内置的屏幕截图功能,但我的主窗口超出了我的屏幕大小。任何人都知道一种完全捕获窗口的方法,或者是否有预先构建的类可以执行此操作?

2 个答案:

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