2009-11-21 190 views
8

在Qt中,我如何截取特定窗口的屏幕截图(例如,假设我有记事本,并想截取标题为“无标题 - 记事本”的窗口) ? 在他们的屏幕截图示例代码中,他们展示了如何把整个桌面的截图:截取特定窗口的屏幕截图 - C++/Qt

originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId()); 

我该如何获得winId()为一个特定的窗口(假设我知道窗口的标题)的Qt的?

谢谢

回答

2

我很确定这是平台特定的。 winIds是Windows上的HWND,因此您可以在给出的示例中调用FindWindow(NULL, "Untitled - Notepad")

+0

这不是一个Qt解决方案... – lpapp 2014-04-27 03:12:24

1

也看看WindowFromPointEnumChildWindows。后者可以让你提醒用户,如果你有多个相同标题的窗口,可以消除歧义。

3

对于Qt的你“采取特定窗口的屏幕截图”的方式是:

/*------ Take a screenshot of a window ------*/ 
// window is a: QWidget *window; 
originalPixmap = QPixmap::grabWidget(window); 
+4

我不明白为什么这个答案有这么多upvotes。这完全是错误的。 OP要求提供任何窗口,而不是同一个应用程序。他甚至强调,在他的例子中(“记事本”)它有不同的应用。 – leemes 2014-09-16 17:27:54

2

看QDesktopWidget类。这是一个从QWidget的继承所以从字面上没有采取截图的问题:

QPixmap pm(QDesktopWidget::screenGeometry().size()); 
QDesktopWidget::screen().render(&pm); // pm now contains screenshot 
+1

对于'4.8'版本,我不得不对你的代码片断做些小改动。主要是:创建一个'QDesktopWidget'类型的对象来调用'screenGeometry()'和'screen()',并将'screen()。render()'改变为'screen() - > render()', ()'返回一个'QWidget *'。 – 2015-04-22 10:38:33

0

虽然这已经回答了,只是为了完整起见,我将添加到特雷弗·博伊德·史密斯的职位(见上文)代码-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); 
} 
2

看一看Screenshot example

简而言之:

QScreen *screen = QGuiApplication::primaryScreen(); 
if (screen) 
    QPixmap originalPixmap = screen->grabWindow(0);