2009-11-21 28 views
8

En Qt, ¿cómo hago una captura de pantalla de una ventana específica (es decir, supongo que tenía el Bloc de notas y quería tomar una captura de pantalla de la ventana titulada "Sin título - Bloc de notas") ? En su código de captura de ejemplo, muestran cómo tomar una captura de pantalla de todo el escritorio:Tomando captura de pantalla de una ventana específica - C++/Qt

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

¿Cómo puedo obtener el winId() para una ventana específica (suponiendo que sabía título de la ventana) en Qt?

Gracias

Respuesta

2

Estoy bastante seguro de que es específico de la plataforma. Los winID son HWND en Windows, por lo que puede llamar al FindWindow(NULL, "Untitled - Notepad") en el ejemplo que proporcionó.

+0

Esto no es una solución de Qt ... – lpapp

1

También vea WindowFromPoint y EnumChildWindows. Esto último podría permitirle solicitar al usuario que elimine la ambigüedad si tenía varias ventanas con el mismo título.

3

para Qt la forma en que "toma una captura de pantalla de una ventana específica" es:

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

No entiendo por qué esta respuesta tiene tantos votos ascendentes. Simplemente está mal. OP pidió cualquier ventana, no una de la misma aplicación. Incluso enfatiza que es de una aplicación diferente en su ejemplo ("Bloc de notas"). – leemes

2

mirada a la clase QDesktopWidget. Ha heredado de QWidget por lo que literalmente no hay problema de tomar captura de pantalla:

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

Para la versión '4.8' tuve que hacer pequeños cambios en su fragmento. Principalmente: crea un objeto de tipo 'QDesktopWidget' para llamar a' screenGeometry() 'y' screen() ', y cambia' screen(). Render() 'a' screen() -> render() ', as' screen() 'devuelve un' QWidget * '. –

0

Aunque esto ya ha sido contestada, sólo por el mayor abundamiento, voy a agregar al post de Trevor Boyd Smith (véase más arriba) un código de -snippet ejemplo:

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

Para consultar todas Screenshot example

en resumen:

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