如何一起使用Qt和SDL?

时间:2020-03-06 14:34:35  来源:igfitidea点击:

我正在Windows中构建物理仿真引擎和编辑器。我想使用Qt构建编辑器部件,并且想在OpenGL中使用SDL运行引擎。

我的第一个想法是仅使用Qt构建编辑器,并与引擎(资源管理器,渲染器,数学工具)共享尽可能多的代码。但是,我也希望能够在编辑器中运行仿真。这意味着我还必须共享使用SDL线程的仿真代码。

所以,我的问题是:是否可以通过使用SDL将渲染OpenGL渲染到Qt窗口?

我已经在网上阅读到有可能为SDL提供一个可在其中渲染的窗口句柄。有人有什么经验吗?

而且,模拟器的线程部分可能会出现问题,因为它使用SDL线程。

解决方案

从QT渲染到opengl很简单(效果很好)
没有SDL的直接经验,但是这里有一个有关混合它们的示例应用程序。
http://www.devolution.com/pipermail/sdl/2003-January/051805.html

这里有一篇很好的文章,关于直接将QT widgewts与opengl混合
http://doc.trolltech.com/qq/qq26-openglcanvas.html有点超出严格要求,但是却很聪明!

这是我在项目中所做的简化。我们可以像使用普通小部件一样使用它,但是根据需要,可以使用它的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表面尺寸是有意义的。

尽管我们可能像第一个答案那样使它工作,但建议我们可能会由于线程问题而遇到问题。关于线程,没有简单的解决方案,在这里我们将具有SDL Qt和OpenGL mainloop的交互作用。不好玩。

最简单,最合理的解决方案是将两个零件分离。这样SDL和Qt可以在单独的进程中运行,并使它们使用某种消息传递进行通信(我建议在此使用d-bus)。我们可以将SDL渲染到无边界窗口中,然后编辑器通过消息发送命令。