在 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 如何做到?
当然,
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;
}
对于旧的 Qt 版本:
您可以使用主屏幕(桌面)虚拟几何并捕获整个桌面,无需额外的循环和计算:
QRect desktopGeometry = qApp->primaryScreen()->virtualGeometry();
QPixmap desktopPixmap = qApp->primaryScreen()->grabWindow(qApp->desktop()->winId(), desktopGeometry.x(), desktopGeometry.y(), desktopGeometry.width(), desktopGeometry.height());
另请参阅:QDesktopWidget
对于新的 Qt 版本:
QApplication::desktop() 和 QDesktopWidget 已标记为过时,因此对于新项目,建议使用屏幕枚举方法。