在Qt应用程序中,我正在使用以下代码片段来截取完整桌面的屏幕截图:
但是这种方法无法捕捉第二屏幕。
因此我进行了更多搜索,根据这个帖子,使用Qt5全屏截图,我设计了以下的截图捕捉方式:
感谢 @ddriver!
QDesktopWidget* dw = QApplication::desktop();
QPixmap pixmap = QPixmap::grabWindow(dw->winId(), 0, 0,
dw->width(), dw->height());
pixmap.save(name, "JPG", screenshot_quality);
这种方法在Linux和Windows上都非常有效,而且对于双显示器无论屏幕分辨率如何,它都能正常工作,即使两个显示器使用不同的分辨率仍然可以正常工作。 但是,在Qt 5中,我会得到以下运行时警告:
static QPixmap QPixmap::grabWindow(WId, int, int, int, int) is deprecated, use QScreen::grabWindow() instead. Defaulting to primary screen.
我查阅了Qt 5文档,并写下了以下内容:
QScreen * screen = QGuiApplication::primaryScreen();
QPixmap pixmap = screen->grabWindow(0);
pixmap.save(name, "JPG", screenshot_quality);
但是这种方法无法捕捉第二屏幕。
因此我进行了更多搜索,根据这个帖子,使用Qt5全屏截图,我设计了以下的截图捕捉方式:
QScreen * screen = QGuiApplication::primaryScreen();
QRect g = screen->geometry();
QPixmap pixmap = screen->grabWindow(0, g.x(), g.y(), g.width(), g.height());
pixmap.save(name, "JPG", screenshot_quality);
很不幸,这个方法也不起作用。
引起我的注意的是,在Qt 4中使用的方法运行良好。因此,我想象一定有办法在Qt 5中实现它。
所以,我的问题是如何在Qt 5中完成它?
编辑:这是我解决的方式:
QPixmap grabScreens()
{
QList<QScreen*> screens = QGuiApplication::screens();
QList<QPixmap> scrs;
int w = 0, h = 0, p = 0;
foreach (auto scr, screens)
{
QRect g = scr->geometry();
QPixmap pix = scr->grabWindow(0, g.x(), g.y(), g.width(), g.height());
w += pix.width();
h = max(h, pix.height());
scrs.append(pix);
}
QPixmap final(w, h);
QPainter painter(&final);
final.fill(Qt::black);
foreach (auto scr, scrs)
{
painter.drawPixmap(QPoint(p, 0), scr);
p += scr.width();
}
return final;
}
感谢 @ddriver!