Qt 5中双显示器的屏幕截图
Screenshot capture of dual monitor in Qt 5
在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);
但这种方法不会捕获第二个屏幕。
所以我搜索了更多,根据这个线程,使用 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!
自然,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;
}
此外,您可以使用主屏幕的(桌面)虚拟几何体并捕获整个桌面,而无需额外的循环和计算:
QRect desktopGeometry = qApp->primaryScreen()->virtualGeometry();
QPixmap desktopPixmap = qApp->primaryScreen()->grabWindow(qApp->desktop()->winId(), desktopGeometry.x(), desktopGeometry.y(), desktopGeometry.width(), desktopGeometry.height());
参见:QDesktopWidget
更新:
目前,QApplication::d esktop() 和 QDesktopWidget 由于某种原因被 Qt 标记为过时,因此对于新项目,建议使用屏幕枚举方法。无论如何,对于旧的和当前的Qt版本,此解决方案必须按预期工作。
相关文章:
- Winapi:屏幕截图未显示在窗口中
- 截取屏幕截图后程序卡住
- C++鼠标单击时的屏幕截图不起作用
- GTKMM:拍摄绘图区域的屏幕截图?
- 有没有办法使用 ofstream 保存屏幕截图?
- 如何使用 DX11 截取屏幕截图?
- avcodec_receive_packet错误(gdi 屏幕截图 + ffmpeg)
- C++屏幕截图 - 如何读取位图?
- 使用QT C 屏幕截图
- 如何将屏幕截图位图转换为 cv::Mat
- QT自动保存使用命名模板的屏幕截图
- C 屏幕截图
- BMP的完整屏幕截图.与块状和保存有关的问题
- 使用OpenCV和C++在按键上截取网络摄像头源的屏幕截图
- DirectX 部分屏幕截图
- 截取屏幕截图,分析它,然后删除它
- 多显示器屏幕截图只有2个显示器在C++与WinApi
- 如何截取第二个屏幕显示器的屏幕截图
- Qt 5中双显示器的屏幕截图
- Gdi+Take屏幕截图多个显示器