Pergunta

Eu tenho um MDI aplicativo escrito em Qt.Alguns dos subwindows incluem QGLWidgets, 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:

  1. 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.)
  2. QPixmap::grabWindow silenciosamente deixa todos os OpenGL contextos vazio-mesmo aqueles que usam formas básicas só.
  3. 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 que Alt+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?

Foi útil?

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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top