Como faço para usar o Qt e SDL juntos?
Pergunta
Eu estou construindo um mecanismo de simulação física e editor no Windows. Eu quero construir a parte editor usando Qt e eu quero correr o motor usando SDL com OpenGL.
A minha primeira idéia era construir o editor usando apenas Qt e compartilhar tanto código com o motor (o gerenciador de recursos, o processador, a matemática). Mas, eu também gostaria de ser capaz de executar a simulação dentro do editor. Isto significa que eu também tenho que compartilhar o código de simulação que usa threads do SDL.
Então, minha pergunta é esta:? Existe uma maneira de ter uma render OpenGL para uma janela Qt usando SDL
Eu li na web que pode ser possível fornecer SDL com um identificador de janela em que para renderizar. Alguém tem experiência dong isso?
Além disso, a parte rosqueada do simulador pode representar um problema, uma vez que utiliza threads do SDL.
Solução
Enquanto você pode fazê-lo funcionar como primeira resposta sugiro que você provavelmente vai ter problemas devido à threading. Não há soluções simples quando se trata de threading, e aqui você teria SDL Qt e OpenGL mainloop interagindo. Não é divertido.
A solução mais fácil e mais sã seria dissociar ambas as partes. Assim que SDL e Qt executados em processos separados e tê-los usar algum tipo de mensagens para comunicar (eu recomendo d-bus aqui). Você pode ter SDL renderizar na janela sem bordas e seu editor envia comandos através de mensagens.
Outras dicas
Esta é uma simplificação do que eu faço no meu projeto. Você pode usá-lo apenas como um widget comum, mas como você precisa, você pode usá-lo do objeto m_Screen para desenhar a superfície da SDL e ele vai mostrar no widget:)
#include "SDL.h"
#include <QWidget>
class SDLVideo : public QWidget {
Q_OBJECT
public:
SDLVideo(QWidget *parent = 0, Qt::WindowFlags f = 0) : QWidget(parent, f), m_Screen(0){
setAttribute(Qt::WA_PaintOnScreen);
setUpdatesEnabled(false);
// Set the new video mode with the new window size
char variable[64];
snprintf(variable, sizeof(variable), "SDL_WINDOWID=0x%lx", winId());
putenv(variable);
SDL_InitSubSystem(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
// initialize default Video
if((SDL_Init(SDL_INIT_VIDEO) == -1)) {
std:cerr << "Could not initialize SDL: " << SDL_GetError() << std::endl;
}
m_Screen = SDL_SetVideoMode(640, 480, 8, SDL_HWSURFACE | SDL_DOUBLEBUF);
if (m_Screen == 0) {
std::cerr << "Couldn't set video mode: " << SDL_GetError() << std::endl;
}
}
virtual ~SDLVideo() {
if(SDL_WasInit(SDL_INIT_VIDEO) != 0) {
SDL_QuitSubSystem(SDL_INIT_VIDEO);
m_Screen = 0;
}
}
private:
SDL_Surface *m_Screen;
};
Espero que isso ajude
Nota:. Ele geralmente faz sentido definir a min e tamanho máximo desse widget para o tamanho da superfície SDL
renderização em OpenGL de QT é trivial (e funciona muito bem) Nenhuma experiência direta do SDL, mas há um exemplo aplicativo aqui sobre misturá-los. http://www.devolution.com/pipermail/sdl/2003- janeiro / 051805.html
Há um bom artigo sobre a mistura QT widgewts diretamente com o OpenGL aqui http://doc.trolltech.com/qq/qq26-openglcanvas.html um pouco além do que você estritamente precisa, mas bastante inteligente!
você poderia usar esta biblioteca (ver o diretório demo):
https://github.com/kronat/libqsdl
Tenha um bom dia