在Qt应用程序的上下文中,我使用以下代码片段来拍摄完整桌面的屏幕截图:
QDesktopWidget* dw = QApplication::desktop();
QPixmap pixmap = QPixmap::grabWindow(dw->winId(), 0, 0,
dw->width(), dw->height());
pixmap.save(name, "JPG", screenshot_quality);
Run Code Online (Sandbox Code Playgroud)
这种方法在Linux和Windows以及双显示器上都非常有效,与屏幕分辨率无关。也就是说,如果两台显示器以不同的分辨率工作,它仍然可以工作。但是,使用Qt 5时,我得到以下运行时警告:
static QPixmap QPixmap::grabWindow(WId, int, int, int, int) is deprecated, use QScreen::grabWindow() instead. Defaulting to primary screen.
Run Code Online (Sandbox Code Playgroud)
因此,我查看了Qt 5文档,并编写了以下代码:
QScreen * screen = QGuiApplication::primaryScreen();
QPixmap pixmap = screen->grabWindow(0);
pixmap.save(name, "JPG", screenshot_quality);
Run Code Online (Sandbox Code Playgroud)
但是这种方法不能捕获第二个屏幕。
因此,我进行了更多搜索,并根据该主题“使用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);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这也行不通。
引起我注意的是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;
}
Run Code Online (Sandbox Code Playgroud)
感谢@ddriver!
自然,QGuiApplication::primaryScreen()会给您一个屏幕。
您可以QList<QScreen *> QGuiApplication::screens()用来获取与该应用程序关联的所有屏幕,为所有屏幕截图,然后创建另一个空白图像,根据想要的屏幕组成对其进行大小调整,然后使用手动将其合成为最终图像QPainter。
QPixmap grabScreens() {
auto screens = QGuiApplication::screens();
QList<QPixmap> scrs;
int w = 0, h = 0, p = 0;
foreach (auto scr, screens) {
QPixmap pix = scr->grabWindow(0);
w += pix.width();
if (h < pix.height()) h = pix.height();
scrs << 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;
}
Run Code Online (Sandbox Code Playgroud)