Снимок экрана конкретного окна-C++ / Qt

в Qt, как мне сделать снимок экрана определенного окна (т. е. предположим, что у меня был блокнот, и я хотел сделать снимок экрана окна под названием "Без названия - Блокнот")? В их примере скриншота, они показывают, как сделать скриншот всего рабочего стола:

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

Как бы я получил winId () для определенного окна (предполагая, что я знал название окна) в Qt?

спасибо

6 ответов


Я уверен, что это платформы. winIds-это HWNDs в Windows, поэтому вы можете вызвать вы дали.


для Qt способ, которым вы "делаете скриншот определенного окна", заключается в следующем:

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

посмотрите на класс QDesktopWidget. Он унаследован от QWidget, поэтому буквально нет проблем с скриншотом:

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

посмотреть скриншот пример

короче:

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

также посмотреть WindowFromPoint и EnumChildWindows. Последнее может позволить вам предложить пользователю устранить двусмысленность, если у вас несколько окон с одинаковым названием.


хотя на это уже был дан ответ, просто для полноты, я добавлю к сообщению Тревора Бойда Смита (см. выше) пример фрагмента кода:

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);
}