PyQt4 - QWidget 另存为图像
我想用Python来编程,把PyQt4中的一个QWidget保存成图片(格式可以是PNG、PDF、JPEG、GIF等等都可以)。
我以为这会很简单,但实际上我在网上找不到相关的信息。有人能给我指个方向吗?
为了更清楚,我想做的是这个
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?
1 个回答
11
你可以使用 QPixmap.grabWindow()
这个方法来实现这个功能。
根据文档的说明:
这个方法会抓取指定窗口的内容,并把它做成一个图片。最后会返回这个图片。
参数 (x, y) 用来指定在窗口中的偏移位置,而 (w, h) 则是用来指定要复制的区域的宽度和高度。
如果宽度 w 是负数,函数会复制窗口右边的所有内容。如果高度 h 是负数,函数会复制窗口底部的所有内容。
需要注意的是,grabWindow() 是从屏幕上抓取像素,而不是从窗口中抓取。如果有其他窗口部分或完全覆盖了你要抓取的窗口,你也会得到覆盖窗口的像素。
另外,鼠标光标通常不会被抓取。
我们使用窗口标识符而不是 QWidget 的原因是为了能够抓取那些不属于应用程序的窗口,比如系统窗口框架等等。
警告:一般来说,抓取屏幕外的区域是不安全的。这取决于底层的窗口系统。
警告:仅适用于 X11:如果窗口的深度与根窗口不一样,并且有其他窗口部分或完全遮挡了你要抓取的窗口,你将无法获得覆盖窗口的像素。被遮挡区域在图片中的内容是未定义和未初始化的。
示例代码:
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_()
这个代码会生成一个看起来像这样的窗口:
当你点击按钮时,它会在当前目录下创建一个名为 Screenshot.jpg
的文件。这个图片看起来是这样的(注意窗口框架缺失):