我如何同时使用Qt和SDL?

30

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

我的第一个想法是仅使用Qt构建编辑器,并尽可能多地共享代码(资源管理器,渲染器,数学计算)。但是,我也想能够在编辑器内运行模拟。这意味着我还必须共享使用SDL线程的模拟代码。

因此,我的问题是:是否有一种方法可以通过使用SDL将渲染OpenGL到Qt窗口中?

我在网上看到可以将窗口句柄提供给SDL以进行渲染。有人有这方面的经验吗?

此外,模拟器的线程部分可能会带来问题,因为它使用SDL线程。


这是我现在开始的一个开源项目。随着项目的进展,我会发布我的架构/解决方案。 - bineteri
根据您想要完成的任务,我相信您可以直接选择Qt并完全放弃SDL。Qt具有整洁的OpenGL支持,提供输入处理,更好的(无意冒犯,SDL人员)用户界面能力等。使用OpenGL Qt小部件非常简单,Qt框架提供的线程模型也非常易于使用(您可以使用标准线程、并发等+信号/槽概念)。如果线程模型不符合您的喜好,您可以使用例如boost之类的东西。无论如何,在您的情况下,我真的看不出使用SDL + Qt的理由。 - rbaleksandar
3个回答

24
这是我在项目中所做的简化版本。您可以像使用普通小部件一样使用它,但是需要时,您可以使用它的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表面大小是有意义的。

窗口ID黑客在Mac上有效吗?在OSX上似乎不起作用。我尝试了putenv和SDL_putenv,但都没有成功。 - S B
我知道现在已经很晚了,但是有人能向我解释一下这是如何工作的吗? - Whyrusleeping

15

虽然您可能会按照第一个答案建议的方式使其工作,但由于线程问题,您可能会遇到问题。涉及线程时没有简单的解决方案,在这里,您将使用SDL Qt和OpenGL主循环进行交互。不好玩。

最简单和最明智的解决方案是将两个部分解耦。这样,SDL和Qt在单独的进程中运行,并使用某种消息传递进行通信(我建议使用d-bus)。您可以让SDL渲染无边框窗口,您的编辑器通过消息发送命令。


谢谢,这些信息非常有价值。我认为我需要将工作分成两个进程。最大的障碍来自于共享OpenGL“上下文”。Qt的小部件与OpenGL / SDL不兼容。线程似乎很好用,因为QT和SDL使用相同的库(pthreads,win32线程)。 - bineteri

3

OpenGL不是问题所在。我知道它与Qt很好地配合使用。问题主要在于线程处理。 - bineteri
我的错误,我以为SDL是物理引擎库! - Martin Beckett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接