Qt MDI aplicativo com OpenGL:como agarrar um válido screenshot?
-
20-09-2019 - |
Pergunta
Eu tenho um MDI aplicativo escrito em Qt.Alguns dos subwindows incluem QGLWidget
s, por exemplo, OpenGL contextos.O mais notável destes usar o OpenGL vértice e fragmento de shaders para visualizar seus dados.
Eu preciso programaticamente uma captura de tela da janela principal do aplicativo, incluindo, naturalmente, a todos os subwindows que acontecer para ser visível.Parece fácil à primeira ("definitivamente foi perguntado muitas vezes, por isso vamos apenas o google it!"), mas depois de uma olhada mais de perto parece estar a ficar um pouco complicado...
Agora aqui está o que eu tentei até agora:
QPixmap::grabWidget
não funciona para o subwindows que usam programas de shader, aparentemente porque o redirecionamento de contexto não parece suportar o necessário OpenGL extensions.(O código de processamento verifica que o contexto associado suporta as extensões necessárias, e se recusa a continuar se não.)QPixmap::grabWindow
silenciosamente deixa todos os OpenGL contextos vazio-mesmo aqueles que usam formas básicas só.QGLWidget::grabFrameBuffer
funciona, mas só captura o OpenGL contexto específico da subjanela, considerando que eu gostaria de pegar a totalidade do pedido (essencialmente o queAlt+PrtScr
no Windows).
Eu também tentei fazer primeiro o #2 e, em seguida, iteração #3 para todos os subwindows, basta copiar o resultado do #3 para o local certo de que a imagem #2.Isso funcionou muito bem, até fiz algumas subwindows sobreposição -- caso em que as imagens do #3 substituir a subjanela de quadros, etc.Portanto, essa abordagem provavelmente iria exigir muito mais de um código para lidar com todos os desagradável casos de canto...
Algumas informações adicionais:Uma vez eu a captura de ecrã, vou colocar vários deles em um seqence, a fim de criar um vídeo-provavelmente usando ffmpeg.O que torna esta questão uma espécie de continuação de a (primeira parte) a minha pergunta anterior;é que o app tem evoluído a partir de um único contexto autônomo programa OpenGL para algo que usa Qt para o total de janelas e UI widget coisas, e incorpora elementos gráficos em subwindows.
Enquanto eu ia preferir um bom, Qt-ish solução de plataforma cruzada, eu estou disposto a considerar recorrer a um Windows hack específico, também.(Que deve ser possível, como eu posso ver Alt+PrtScr
fazendo muito a coisa certa.)
Então, alguma sugestão?
Solução
Muito hackish, mas não captura a área de trabalho (sem esconder a sua janela), como em este tutorial e o corte de tudo, mas sua janela de trabalho?
Mais geralmente, nem sequer tenho a certeza de que o OpenGL especificação de exigências que a saída tem de ser colocado na frente de buffer:uma implementação poderia simplesmente usar sobreposições de vídeo (ou Voodoo2-esque VGA passagem travessuras) para a saída.
Outras dicas
A única coisa que posso pensar de fora-de-mão é fazer o seguinte psuedocode:
for each window
grab the window into its own pixmap
grab the GL portions and paste into the windows
order the window pixmaps by depth of the window (deepest first)
initialize a common pixmap
for each window pixmap
paint the window pixmap into the common pixmap at the appropriate location.
Este é qualquer uso??
O Grabber exemplos mostra como recuperar o conteúdo de um framebuffer OpenGL