在Qt应用程序的上下文中,我使用下面的代码片段来截取整个桌面的屏幕截图:
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);
但这种方法并没有捕捉到第二个屏幕。
所以我又搜索了一下,根据这个线程Taking Screenshot of Full Desktop with 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!
2条答案
按热度按时间eqfvzcg81#
当然,
QGuiApplication::primaryScreen()
将为您提供单个屏幕。您可以使用
QList<QScreen *> QGuiApplication::screens()
获取与应用程序关联的所有屏幕,对所有屏幕进行截屏,然后创建另一个空白图像,根据您希望如何合成屏幕来调整其大小,并使用QPainter
手动合成为最终图像。8cdiaqws2#
此外,您还可以使用主屏幕(桌面)的虚拟几何图形,并捕获整个桌面,而无需额外的循环和计算:
另请参阅:QDesktopWidget
目前,QApplication::desktop()和QDesktopWidget由于某种原因被Qt标记为过时,因此对于新项目,建议使用屏幕枚举方法。无论如何,对于旧版本和当前Qt版本,此解决方案必须按预期工作。