PyQt4 - 将QWidget保存为图像

4
我正在尝试使用Python在PyQt4中以图像格式(PNG,PDF,JPEF,GIF等)编程方式保存QWidget。我认为这应该非常简单,但事实上我在网上找不到任何相关信息。请问有谁能指点一下我该怎么做吗?
需要澄清的是,我正在尝试做的是:
gui = <SOME QMainWindow>
gui.show()  # this displays the gui. it's useful, but what i need is to save the image
gui.save("image.png")    ## How do I do this?  

我以前从未做过这个,但也许这个问题会引导你朝着正确的方向前进(请注意,这是Qt4 C++):https://dev59.com/DHnZa4cB1Zd3GeqPuMbN - djhoese
1个回答

11

您可以使用QPixmap.grabWindow()方法来完成此操作。

从文档中可以得知:

抓取窗口window的内容并生成一个 pixmap。 返回该pixmap。

参数(x,y)指定窗口中的偏移量,而(w,h)指定要复制的区域的宽度和高度。

如果w是负数,则函数将所有内容复制到窗口的右边界。如果h是负数,则函数将所有内容复制到窗口底部。

请注意,grabWindow()会从屏幕获取像素,而不是从窗口获取像素。如果有另一个窗口部分或完全位于您要获取的窗口上方,则还会获取来自覆盖窗口的像素。

请注意,通常不会捕获鼠标光标。

我们使用窗口标识符而不是QWidget的原因是为了能够抓取不属于应用程序、窗口系统框架等的窗口。

警告:一般情况下,抓取屏幕外的区域是不安全的。这取决于底层窗口系统。

警告:仅适用于X11:如果窗口与根窗口的深度不同,并且另一个窗口部分或完全遮挡了您要获取的窗口,则不会从上层窗口获取像素。pixmap中被遮挡区域的内容未定义且未初始化。

示例代码:

import sys
from PyQt4.QtGui import *

filename = 'Screenshot.jpg'
app = QApplication(sys.argv)
widget = QWidget()
widget.setLayout(QVBoxLayout())
label = QLabel()
widget.layout().addWidget(label)

def take_screenshot():
    p = QPixmap.grabWindow(widget.winId())
    p.save(filename, 'jpg')

widget.layout().addWidget(QPushButton('take screenshot', clicked=take_screenshot))

widget.show()
app.exec_()

这将生成一个看起来像这样的窗口:

Application UI

当您单击按钮时,它将在当前目录中创建一个名为Screenshot.jpg的文件。该图像将是这样的(请注意窗口框架已丢失):

Screenshot


如果有人正在寻找Pyqt5的解决方案,请查看这里的答案。 - Freya W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接