Pregunta

Estoy construyendo una simulación de la física del motor y editor en Windows.Quiero construir el editor de la parte con Qt y quiero hacer funcionar el motor con el uso de SDL con OpenGL.

Mi primera idea fue construir el editor utilizando sólo Qt y compartir código con el motor (el gestor de recursos, el procesador, el de las matemáticas).Pero, también me gustaría ser capaz de ejecutar la simulación dentro del editor. Esto significa también tengo que compartir la simulación de código que utiliza SDL hilos.

Por lo tanto, mi pregunta es esta:Es allí una manera de tener un render OpenGL para una ventana Qt mediante el uso de SDL?

He leído en la web que podría ser posible para el suministro de SDL con un identificador de ventana en el que se representará.Alguien tiene experiencia dong que?

También, la parte roscada del simulador puede suponer un problema, ya que utiliza SDL hilos.

¿Fue útil?

Solución

Mientras que usted puede conseguir que funcione como primera respuesta sugieren que es probable que surjan problemas debido a las operaciones de roscado.No hay soluciones simples cuando se trata de roscar, y aquí habría SDL Qt y OpenGL mainloop la interacción.No es divertido.

La forma más fácil y sanest solución sería separar ambas partes.Así que SDL y Qt se ejecutan en procesos independientes y de usar algún tipo de mensajería para comunicarse (yo recomiendo de d-bus aquí ).Usted puede tener SDL generar en los bordes de la ventana y su editor envía comandos a través de mensajes.

Otros consejos

Esta es una simplificación de lo que hago en mi proyecto.Usted puede usarlo como un ordinario widget, pero como usted necesita, usted puede usar es m_Screen objeto de señalar a la SDL superficie y se mostrará en el 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 esto ayude

Nota:Normalmente tiene sentido para establecer el mínimo y el máximo tamaño de este widget a la SDL tamaño de la superficie.

La representación en opengl de QT es trivial (y funciona muy bien) Ninguna experiencia directa de la SDL, pero no es un ejemplo de la aplicación aquí acerca de la mezcla de ellos.http://www.devolution.com/pipermail/sdl/2003-January/051805.html

Hay un buen artículo sobre la mezcla de QT widgewts directamente con el opengl aquí http://doc.trolltech.com/qq/qq26-openglcanvas.html un poco más allá de lo estrictamente necesario, sino más bien inteligente!

usted podría utilizar esta biblioteca (consulte el directorio demo):

https://github.com/kronat/libqsdl

Que tengan un buen día

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top