在Qt中,我如何截取特定窗口的屏幕截图(例如,假设我有记事本,并想截取标题为“无标题 - 记事本”的窗口) ? 在他们的屏幕截图示例代码中,他们展示了如何把整个桌面的截图:截取特定窗口的屏幕截图 - C++/Qt
originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId());
我该如何获得winId()为一个特定的窗口(假设我知道窗口的标题)的Qt的?
谢谢
在Qt中,我如何截取特定窗口的屏幕截图(例如,假设我有记事本,并想截取标题为“无标题 - 记事本”的窗口) ? 在他们的屏幕截图示例代码中,他们展示了如何把整个桌面的截图:截取特定窗口的屏幕截图 - C++/Qt
originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId());
我该如何获得winId()为一个特定的窗口(假设我知道窗口的标题)的Qt的?
谢谢
我很确定这是平台特定的。 winIds是Windows上的HWND,因此您可以在给出的示例中调用FindWindow(NULL, "Untitled - Notepad")
。
也看看WindowFromPoint
和EnumChildWindows
。后者可以让你提醒用户,如果你有多个相同标题的窗口,可以消除歧义。
对于Qt的你“采取特定窗口的屏幕截图”的方式是:
/*------ Take a screenshot of a window ------*/
// window is a: QWidget *window;
originalPixmap = QPixmap::grabWidget(window);
我不明白为什么这个答案有这么多upvotes。这完全是错误的。 OP要求提供任何窗口,而不是同一个应用程序。他甚至强调,在他的例子中(“记事本”)它有不同的应用。 – leemes 2014-09-16 17:27:54
看QDesktopWidget类。这是一个从QWidget的继承所以从字面上没有采取截图的问题:
QPixmap pm(QDesktopWidget::screenGeometry().size());
QDesktopWidget::screen().render(&pm); // pm now contains screenshot
对于'4.8'版本,我不得不对你的代码片断做些小改动。主要是:创建一个'QDesktopWidget'类型的对象来调用'screenGeometry()'和'screen()',并将'screen()。render()'改变为'screen() - > render()', ()'返回一个'QWidget *'。 – 2015-04-22 10:38:33
虽然这已经回答了,只是为了完整起见,我将添加到特雷弗·博伊德·史密斯的职位(见上文)代码-snippet例如:
void MainWindow::on_myButton_GUI_Screeshot_clicked()
{
QPixmap qPixMap = QPixmap::grabWidget(this); // *this* is window pointer, the snippet is in the mainwindow.cpp file
QImage qImage = qPixMap.toImage();
cv::Mat GUI_SCREENSHOT = cv::Mat( qImage.height(),
qImage.width(), CV_8UC4,
(uchar*)qImage.bits(),
qImage.bytesPerLine() );
cv::imshow("GUI_SCREENSHOT",GUI_SCREENSHOT);
}
简而言之:
QScreen *screen = QGuiApplication::primaryScreen();
if (screen)
QPixmap originalPixmap = screen->grabWindow(0);
这不是一个Qt解决方案... – lpapp 2014-04-27 03:12:24