Снимок экрана конкретного окна-C++ / Qt
в Qt, как мне сделать снимок экрана определенного окна (т. е. предположим, что у меня был блокнот, и я хотел сделать снимок экрана окна под названием "Без названия - Блокнот")? В их примере скриншота, они показывают, как сделать скриншот всего рабочего стола:
originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId());
Как бы я получил winId () для определенного окна (предполагая, что я знал название окна) в Qt?
спасибо
6 ответов
для 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);
}