解决QPixmap报“QPixmap::grabWindow(): Unable to copy pixels from framebuffer“问题
今天在使用QPixmap::grabWindow()截图时,弹出“QPixmap::grabWindow(): Unable to copy pixels from framebuffer”错误。
问题原因:QPixmap::grabWindow()这个函数适用于Qt5版本截屏,但该函数在Qt4上表现不稳定,经常出现“Unable to copy pixels from framebuffer”错误。
解决方法:建议改成QPixmap::grabWidget()来进行截图。
详细步骤,请查看第2节【修复代码B】。
1 原始代码A
#include <QApplication>
#include <QPixmap>
#include <QScreen>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 获取当前活动窗口的 ID
WId windowId = QApplication::activeWindow()->winId();
// 捕获窗口截图
QPixmap screenshot = QPixmap::grabWindow(windowId); //此处经常报错,偶尔可用,但不稳定
if (screenshot.isNull()) {
qDebug() << "Failed to grab window screenshot.";
} else {
// 保存截图
screenshot.save("screenshot.png");
qDebug() << "Window screenshot saved successfully.";
}
return a.exec();
}
2 修复代码B
#include <QApplication>
#include <QPixmap>
#include <QScreen>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 获取当前活动窗口的 ID
WId windowId = QApplication::activeWindow()->winId();
// 捕获窗口截图
//修复如下
QRect rect= QApplication::desktop()->screenGeometry();
QPixmap qpScreen = QPixmap::grabWidget(QApplication::desktop(),rect);
if (screenshot.isNull()) {
qDebug() << "Failed to grab window screenshot.";
} else {
// 保存截图
screenshot.save("screenshot.png");
qDebug() << "Window screenshot saved successfully.";
}
return a.exec();
}
参考文献:
【1】 github.2015.mumble-voip.修复QPixmap::grabWindow()报错