在PyQt中打印主窗口
我需要把一个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')