Come posso usare Qt e SDL insieme?
Domanda
Sto costruendo un motore di simulazione fisica e un editor in Windows. Voglio costruire la parte dell'editor usando Qt e voglio far funzionare il motore usando SDL con OpenGL.
La mia prima idea è stata quella di costruire l'editor usando solo Qt e condividere lo stesso codice con il motore (il gestore delle risorse, il renderer, la matematica). Ma vorrei anche poter eseguire la simulazione all'interno dell'editor. Ciò significa che devo anche condividere il codice di simulazione che utilizza thread SDL.
Quindi, la mia domanda è questa: c'è un modo per avere un rendering OpenGL in una finestra Qt usando SDL?
Ho letto sul web che potrebbe essere possibile fornire a SDL un handle di finestra in cui eseguire il rendering. Qualcuno ha esperienza dong che?
Inoltre, la parte filettata del simulatore potrebbe rappresentare un problema poiché utilizza thread SDL.
Soluzione
Anche se potresti farlo funzionare come la prima risposta, suggerisci che probabilmente incontrerai problemi dovuti al threading. Non ci sono soluzioni semplici quando si tratta di threading, e qui dovresti interagire con SDL Qt e OpenGL mainloop. Non divertente.
La soluzione più semplice e più sana sarebbe quella di disaccoppiare entrambe le parti. In modo che SDL e Qt funzionino in processi separati e li facciano usare un qualche tipo di messaggistica per comunicare (consiglierei d-bus qui). Puoi avere il rendering SDL in una finestra senza bordi e il tuo editor invia comandi tramite messaggi.
Altri suggerimenti
Questa è una semplificazione di ciò che faccio nel mio progetto. Puoi usarlo come un normale widget, ma di cui hai bisogno, puoi usare il suo oggetto m_Screen per disegnare sulla superficie SDL e verrà mostrato nel 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;
};
Spero che questo aiuti
Nota: di solito ha senso impostare sia la dimensione minima che massima di questo widget sulla dimensione della superficie SDL.
Il rendering su OpenGL da QT è banale (e funziona molto bene) Nessuna esperienza diretta di SDL, ma qui c'è un'app di esempio sulla miscelazione. http://www.devolution.com/pipermail/sdl/2003- gennaio / 051805.html
C'è un buon articolo sulla miscelazione dei widgewts QT direttamente con l'opengl qui http://doc.trolltech.com/qq/qq26-openglcanvas.html un po 'oltre ciò di cui hai strettamente bisogno ma piuttosto intelligente!
potresti usare questa libreria (vedi la directory demo):
https://github.com/kronat/libqsdl
Buona giornata