Je travaille avec QGLWidget (widget Qt pour OpenGL) et je veux pouvoir capturer l'écran affiché par le widget en tant que fichiers JPEG. Comment puis-je atteindre cet objectif? Y at-il une fonction qui retourne ce qui est actuellement affiché sur le widget en tant qu'image?Capturez le widget Qt en tant que fichier image
Répondre
Normalement avec OpenGL, vous devriez lire le framebuffer en utilisant la fonction glReadPixels()
. Cela placera le contenu du framebuffer dans un tampon que vous avez alloué. Vous avez alors besoin d'une fonction qui convertira cela en JPEG.
Cependant, comme vous utilisez QGLWidget
, vous pouvez utiliser la méthode grabFrameBuffer()
pour obtenir le contenu du tampon d'image comme un objet QImage
. C'est probablement le meilleur moyen d'y aller. Vous pouvez récupérer le contenu du framebuffer, puis utiliser QImage::save()
pour enregistrer dans un fichier.
Si vous passez à Qt 5's QOpenGLWidget
, vous verrez qu'il a une méthode grabFrameBuffer()
similaire.
QImage img(mywidget.size());
QPainter painter(&img);
mywidget.render(&painter);
img.save("/some/file.jpg");
Pourquoi ne pas utiliser la incantatoire très simple QPixmap::grabWindow(m_widget->winId()).save("/some/file.jpg")
Voici la façon la plus simple d'enregistrer widget comme une image, en travaillant sur Qt 5:
QString file = QFileDialog::getSaveFileName(this, "Save as...", "name", "PNG (*.png);; BMP (*.bmp);;TIFF (*.tiff *.tif);; JPEG (*.jpg *.jpeg)");
ui->myWidget->grab().save(file);
malheureusement cela apparemment (pour moi) ne capture pas QGLWidgets contenues dans le widget saisi. – codeling
QPixmap pixmap = QPixmap::grabWidget(&widget);
pixmap.save("widget.png");
Alors que cet extrait de code est le bienvenu, et peut fournir de l'aide, il serait [grandement amélioré s'il comprenait une explication] (// meta.stackexchange.com/q/114762) de * comment * et * pourquoi * cela résout le problème. problème. Rappelez-vous que vous répondez à la question pour les lecteurs dans le futur, pas seulement pour la personne qui demande maintenant! S'il vous plaît [modifier] votre réponse pour ajouter une explication; en particulier, vous devriez expliquer pourquoi vous avez nommé le fichier JPEG si peu conventionnel, et vous devriez probablement montrer comment vous avez confirmé que cela fonctionne aussi bien avec les widgets GL qu'avec les widgets QtGui. –
Les deux méthodes mentionnées sont QImage QGLWidget :: grabFrameBuffer (bool avecAlpha = false) et bool QImage :: save (const QString & nomFichier, const char * format = 0, int qualité = -1) const. – ejel
Puis-je capturer qt painter en tant que flux vidéo? – why