当前位置:  开发笔记 > 编程语言 > 正文

我如何一起使用Qt和SDL?

如何解决《我如何一起使用Qt和SDL?》经验,为你挑选了2个好方法。

我正在Windows中构建物理模拟引擎和编辑器.我想使用Qt构建编辑器部分,我想使用SDL和OpenGL来运行引擎.

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

所以,我的问题是:有没有办法通过使用SDL将OpenGL渲染到Qt窗口?

我在网上看到,可以为SDL提供一个窗口句柄来呈现.有人有经验吗?

此外,模拟器的线程部分可能会出现问题,因为它使用SDL线程.



1> Evan Teran..:

这是我在项目中所做工作的简化.您可以像普通的小部件一样使用它,但是根据需要,您可以使用它的m_Screen对象绘制到SDL表面,它将显示在小部件中:)

#include "SDL.h"
#include 

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表面大小通常是有意义的.



2> Luka Marinko..:

虽然你可能会像第一个答案那样让它工作,但你可能会因为线程问题而遇到问题.在线程方面没有简单的解决方案,在这里你可以使用SDL Qt和OpenGL mainloop进行交互.不好玩.

最简单,最安全的解决方案是将两个部件分离.因此,SDL和Qt在不同的进程中运行,并让它们使用某种消息进行通信(我在这里推荐d-bus).您可以将SDL渲染到无边框窗口,编辑器通过消息发送命令.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有