Je travaille avec Qglwidget (widget Qt pour OpenGL) et je souhaite pouvoir capturer l'écran affiché par le widget en tant que fichiers JPEG. Comment puis-je atteindre cet objectif? Y a-t-il une fonction qui renvoie ce qui est actuellement affiché sur le widget comme une image? P>
5 Réponses :
Normalement avec OpenGL, vous lisiez à partir de la tramebuffer à l'aide du glreadpixels () code>
fonction. Cela mettra le contenu de la tramebuffer dans un tampon que vous avez alloué. Vous avez ensuite besoin d'une fonction qui convertira ceci en JPEG. P>
Cependant, comme vous utilisez Si vous passez à QT 5's's qglwidget code>, vous pouvez utiliser son
grabframebuffer () code>
méthode pour obtenir le contenu de la mémoire tampon de cadre sous forme d'objet qImage code>. C'est probablement le meilleur moyen d'y aller. Vous pouvez saisir le contenu de la tramebuffer, puis utiliser
QIMAGE :: Enregistrer () < / code>
pour enregistrer dans un fichier. p>
QopenglWidget CODE>, vous trouverez qu'il a une similaire
grabframebuffer () code>
méthode. P >
Les deux méthodes mentionnées sont qimage qglwidget :: grabframebuffer (bool withalpha = false) et bool qimage :: const qstring & nom de fichier, const char * format = 0, int Quality = -1) const.
Puis-je capturer le peintre QT comme flux vidéo?
QImage img(mywidget.size()); QPainter painter(&img); mywidget.render(&painter); img.save("/some/file.jpg");
"Si le format est 0, Qimage tentera de deviner le format en regardant le suffixe du nom du fichier." - doc.qt.digia.com/qt/qimage.html#SAVE a>
Il est également important d'avoir widget-> setVisible (true) code> si votre widget a des enfants (et n'est pas déjà visible à l'écran).
Notez que l'utilisation de SETVisible () code> ne fonctionne pas très bien du tout si vous utilisez un
qwidget code> pour le rendu hors écran car le widget sera affiché brièvement.
Pourquoi ne pas utiliser l'incantation très simple qpixmap :: grabwindow (m_widget-> winid ()) .Save ("/some/file.jpg") code> p> p>
Voici le moyen le plus simple d'enregistrer le widget en tant qu'image, fonctionnant 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 contenus dans le widget saisi.
QPixmap pixmap = QPixmap::grabWidget( &widget ); pixmap.save("widget.png");
Tandis que ce code de code est la bienvenue, et peut fournir une aide, ce serait grandement amélioré s'il s'agissait d'une explication de Comment I> et Pourquoi i> Cela résout le problème. N'oubliez pas que vous répondez à la question pour les lecteurs à l'avenir, pas seulement la personne qui demande maintenant! S'il vous plaît Modifier Votre réponse à ajouter une explication; En particulier, vous devez expliquer pourquoi vous avez nommé le fichier JPEG si peu conventionnellement, et vous devez probablement montrer comment vous avez confirmé que cela fonctionne également avec GL Widgets, car il le fait avec des widgets QTui simples.