PyQt4 - QWidget 另存为图像

Posted

技术标签:

【中文标题】PyQt4 - QWidget 另存为图像【英文标题】:PyQt4 - QWidget save as image 【发布时间】:2014-06-25 15:55:50 【问题描述】:

我正在尝试使用 Python 以编程方式将 PyQt4 中的 QWidget 保存为图像(任何格式都可以 - PNG、PDF、JPEF、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?  

【问题讨论】:

我以前从未这样做过,但也许这个问题会引导你走向正确的方向(注意这是 Qt4 C++):***.com/questions/20324409/… 【参考方案1】:

您可以使用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 的文件。所述图像将如下所示(注意缺少窗框):

【讨论】:

如果有人正在寻找 Pyqt5 解决方案,请查看答案here

以上是关于PyQt4 - QWidget 另存为图像的主要内容,如果未能解决你的问题,请参考以下文章

如何为图像创建另存为按钮

生成 div 的图像并另存为

打开“另存为”对话框以下载图像

如何为 PHP 生成的图像设置默认的“图像另存为”名称?

“文件->另存为”和“另存为”之间的照明差异

将颜色条图另存为图像文件