在PyQt中打印主窗口

0 投票
2 回答
2319 浏览
提问于 2025-04-16 15:03

我需要把一个pyqt应用的主窗口保存成PS或者类似的文件格式,这样我就可以把它发给打印机。我本来想用内置的截图功能,但我的主窗口比我的屏幕还大。有没有人知道怎么能完整地捕捉到这个窗口,或者有没有现成的类可以做到这一点?

2 个回答

0

QPixmap.grabWiget这个功能已经不再推荐使用了。我们可以用QWidget.grab()这个函数来捕捉窗口。不过,这个方法只能抓取当前屏幕上可见的部分,这在你有一个可以滚动的窗口时可能会出现问题。所以我找到的唯一有效的方法就是使用ScrollArea的页面步进功能,再配合widget抓取。

# 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")

另外,如果你知道更好的解决办法,请告诉我。

3

QPixmap 有一个静态方法叫做 grabWidget

如果你把这个方法指向你的窗口,它会生成一个图像文件,你可以把它保存到文件里或者用来打印。

如果你是在你的主窗口类里面调用这个方法:

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

撰写回答