web-dev-qa-db-ja.com

QtとSDLを一緒に使用するにはどうすればよいですか?

私はWindowsで物理シミュレーションエンジンとエディターを構築しています。 Qtを使用してエディター部分を構築し、OpenGLでSDLを使用してエンジンを実行したいと思います。

私の最初のアイデアは、Qtのみを使用してエディターを構築し、エンジン(リソースマネージャー、レンダラー、数学)とできるだけ多くのコードを共有することでした。ただし、エディター内でシミュレーションを実行できるようにもしたいと思います。 これは、SDLスレッドを使用するシミュレーションコードも共有する必要があることを意味します。

だから、私の質問はこれです:SDLを使用してQtウィンドウにOpenGLをレンダリングする方法はありますか?

レンダリングするウィンドウハンドルをSDLに提供できる可能性があることをWebで読みました。誰もがそれをドン経験したことがありますか?

また、シミュレータのスレッド部分はSDLスレッドを使用するため、問題が発生する可能性があります。

26
bineteri

最初の答えのように機能するかもしれませんが、スレッドが原因で問題が発生する可能性があります。スレッド化に関しては簡単な解決策はありません。ここでは、SDLQtとOpenGLメインループが相互作用します。楽しくない。

最も簡単で正直な解決策は、両方の部分を切り離すことです。 SDLとQtが別々のプロセスで実行され、通信に何らかのメッセージングを使用するようにします(ここではd-busをお勧めします)。 SDLをボーダレスウィンドウにレンダリングし、エディタがメッセージを介してコマンドを送信することができます。

14
Luka Marinko

これは、私のプロジェクトで行うことを単純化したものです。通常のウィジェットと同じように使用できますが、必要に応じて、m_Screenオブジェクトを使用してSDLサーフェスに描画すると、ウィジェットに表示されます:)

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

お役に立てれば

注:通常、このウィジェットの最小サイズと最大サイズの両方をSDLサーフェスサイズに設定することは理にかなっています。

21
Evan Teran

QTからopenglへのレンダリングは簡単です(そして非常にうまく機能します)SDLの直接の経験はありませんが、それらの混合に関するサンプルアプリがここにあります。 http://www.devolution.com/pipermail/sdl/2003-January/051805.html

QT widgewtsをopenglと直接混合することについての良い記事がここにあります http://doc.trolltech.com/qq/qq26-openglcanvas.html 厳密に必要なものを少し超えていますが、かなり賢いです!

3
Martin Beckett

このライブラリを使用できます(デモディレクトリを参照)。

https://github.com/kronat/libqsdl

ごきげんよう

1
kronat