Eva*_*ran 22
这是我在项目中所做工作的简化.您可以像普通的小部件一样使用它,但是根据需要,您可以使用它的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;
};
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助
注意:将此窗口小部件的最小和最大大小都设置为SDL表面大小通常是有意义的.
Luk*_*nko 14
虽然你可能会像第一个答案那样让它工作,但你可能会因为线程问题而遇到问题.在线程方面没有简单的解决方案,在这里你可以使用SDL Qt和OpenGL mainloop进行交互.不好玩.
最简单,最安全的解决方案是将两个部件分离.因此,SDL和Qt在不同的进程中运行,并让它们使用某种消息进行通信(我在这里推荐d-bus).您可以将SDL渲染到无边框窗口,编辑器通过消息发送命令.