Frage

Ich bin den Aufbau einer Physik-Simulation Engine und Editor in Windows. Ich mag den Editor Teil mit Qt bauen, und ich will den Motor mit SDL mit OpenGL ausgeführt werden.

Meine erste Idee war es, den Editor nur Qt und teilen so viel Code mit dem Motor (der Ressourcenmanager, der Renderer, die Mathematik) zu bauen. Aber ich würde auch in der Lage sein wie die Simulation im Editor auszuführen. Das bedeutet, ich muss auch den Simulationscode teilen, die SDL Threads verwendet.

So ist meine Frage: Gibt es eine Möglichkeit unter Verwendung von SDL eine der Render OpenGL zu einem Qt Fenster haben

Ich habe im Netz gelesen, dass es möglich sein könnte, SDL mit einem Fenstergriff, in dem zur Versorgung zu machen. Jeder hat Erfahrung dong das?

Auch könnte der Gewindeteil des Simulators ein Problem darstellen, da es SDL Threads verwendet.

War es hilfreich?

Lösung

Während Sie könnte es bekommen wie erste Antwort zu arbeiten, schlagen Sie wahrscheinlich Probleme aufgrund Threading ausgeführt wird. Es gibt keine einfachen Lösungen, wenn es um Threading kommt, und hier müssten Sie SDL Qt und OpenGL mainloop interagieren. Keinen Spaß.

Die einfachste und vernünftigste Lösung wäre es, beide Teile zu entkoppeln. So dass SDL und in separaten Prozessen ausgeführt Qt und haben sie irgendeine Art von Messaging zu verwenden, um zu kommunizieren (ich würde d-Bus hier empfehlen). Sie können haben SDL in randlos Fenster machen und Ihren Editor sendet Befehle über Nachrichten.

Andere Tipps

Dies ist eine Vereinfachung das, was ich in meinem Projekt zu tun. Sie können es verwenden, wie ein gewöhnlicher Widget, aber, wie Sie benötigen, können Sie mit ihr Objekt m_Screen ist auf die SDL Oberfläche zu ziehen, und es wird im Widget zeigen:)

#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;
};

Hope, das hilft

. Hinweis: Es in der Regel sinnvoll ist, sowohl die minimale und maximale Größe dieses Widgets auf die SDL Oberflächengröße auf

Rendering auf opengl von QT ist trivial (und funktioniert sehr gut) Keine direkte Erfahrung von SDL, aber es ist ein Beispiel app hier über sie zu mischen. http://www.devolution.com/pipermail/sdl/2003- Januar / 051805.html

Es gibt einen guten Artikel über das Mischen QT hier direkt mit dem opengl widgewts http://doc.trolltech.com/qq/qq26-openglcanvas.html ein bisschen über das, was Sie unbedingt brauchen, sondern clever!

Sie können diese Bibliothek verwenden (siehe Demo-Verzeichnis):

https://github.com/kronat/libqsdl

Haben Sie einen schönen Tag

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top