Comment utiliser Qt et SDL ensemble?

je construis un moteur de simulation physique et un éditeur Dans Windows. Je veux construire la partie editor en utilisant Qt et je veux faire tourner le moteur en utilisant SDL avec OpenGL.

ma première idée a été de construire l'éditeur en utilisant seulement Qt et partager autant de code avec le moteur (le gestionnaire de ressources, le renderer, les mathématiques). Mais j'aimerais aussi pouvoir exécuter la simulation dans l'éditeur. cela signifie que je dois aussi partager le code de simulation qui utilise SDL threads.

alors, ma question Est la suivante: y a-t-il un moyen d'avoir un rendu OpenGL vers une fenêtre Qt en utilisant SDL?

j'ai lu sur le web qu'il pourrait être possible de fournir SDL avec un handle de fenêtre de rendu. Quelqu'un a de l'expérience dong?

de plus, la partie filetée du simulateur pourrait poser un problème puisqu'elle utilise des fils SDL.

22
demandé sur Joel Coehoorn 2008-09-23 05:38:32

4 réponses

alors que vous pourriez obtenir de travailler comme la première réponse suggère que vous allez probablement rencontrer des problèmes en raison de threading. Il n'y a pas de solution simple en matière de threading, et ici vous avez SDL Qt et OpenGL mainloop en interaction. Pas de plaisir.

la solution la plus facile et la plus hygiénique serait de découpler les deux parties. Ainsi, SDL et Qt fonctionnent dans des processus séparés et utilisent une sorte de messagerie pour communiquer (je recommande d-bus ici ). Vous pouvez avoir SDL render en la fenêtre sans frontières et votre éditeur envoie des commandes via des messages.

12
répondu Luka Marinko 2008-10-06 16:37:13

C'est une simplification de ce que je fais dans mon projet. Vous pouvez l'utiliser comme un widget ordinaire, mais comme vous avez besoin, vous pouvez utiliser son objet m_Screen pour dessiner sur la surface SDL et il apparaîtra dans le 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;
};

Espérons que cette aide

Note: il est généralement logique de régler la taille min et max de ce widget à la taille de la surface SDL.

19
répondu Evan Teran 2008-09-28 01:35:28

le rendu sur opengl à partir de QT est trivial (et fonctionne très bien)) Pas d'expérience directe de SDL mais il y a ici un exemple d'application pour les mélanger. http://www.devolution.com/pipermail/sdl/2003-January/051805.html

il y a un bon article sur le mélange des widgewts QT directement avec l'opengl ici http://doc.trolltech.com/qq/qq26-openglcanvas.html un peu au-delà de ce dont vous avez strictement besoin mais plutôt intelligent!

3
répondu Martin Beckett 2008-09-23 02:07:34

vous pouvez utiliser cette bibliothèque (voir le répertoire de démonstration):

https://github.com/kronat/libqsdl

bonne journée

1
répondu kronat 2011-05-13 13:59:09