一、SDLios
SDL用C编写,可与C ++一块儿使用,而且可用于其余几种语言,如C#和Python,支持Windows,Mac OS X,Linux,iOS和Android,是一套开放源代码的跨平台开发库。函数
SDL多用于开发媒体播放器、游戏等多媒体应用领域。ui
首先须要下载SDL,引入其头文件和库this
SDL下载地址:http://www.libsdl.org/spa
由于我是用vs2015开发,因此下载的是上面这个。开放源代码
首先在代码中须要引入SDL头文件和库。code
#include "SDL.h" #undef main #pragma comment(lib,"SDL2.lib") #pragma comment(lib,"SDL2main.lib") #pragma comment(lib,"SDL2test.lib")
加上#undef main的目的是为了防止出现如下错误blog
二、主要函数的做用:游戏
SDL_Init(SDL_INIT_EVERYTHING):表示初始化SDL图片
SDL_CreateWindowFrom((void*)this->winId()):表示嵌入Qt窗口
SDL_GetWindowSurface(_window):获取与窗口相关联的像素信息
SDL_LoadBMP("test.bmp"):是一个宏,做用是读取一个BMP图片
SDL_BlitSurface(_pload, NULL, _pScreens, NULL):也是一个宏,目的是执行从源像素到目标像素的传输。
SDL_UpdateWindowSurface(_window):将窗口复制到屏幕上
三、主要代码
//初始化 void Init() { if (SDL_Init(SDL_INIT_EVERYTHING) < 0) { cout << "SDL_Init failed" << endl; return; } _window = SDL_CreateWindowFrom((void*)this->winId()); if (!_window) { cout << "DL_CreateWindowFrom failed" << endl; return; } }
//绘制图片 void timerEvent(QTimerEvent *event) { _pScreens = SDL_GetWindowSurface(_window); if (!_pScreens) { cout << "SDL_GetWindowSurface failed" << endl; } _pload = SDL_LoadBMP("test.bmp"); if (!_pload) { cout << "SDL_LoadBMP failed" << endl; return; } SDL_BlitSurface(_pload, NULL, _pScreens, NULL); if (SDL_UpdateWindowSurface(_window) < 0) { cout << "SDL_UpdateWindowSurface failed" << endl; } }
四、效果
五、完整代码
#pragma once #include <QtWidgets/QWidget> #include "ui_testSDL.h" #include <QTimerEvent> #include "SDL.h" #undef main #pragma comment(lib,"SDL2.lib") #pragma comment(lib,"SDL2main.lib") #pragma comment(lib,"SDL2test.lib") #include <iostream> using namespace std; class testSDL : public QWidget { Q_OBJECT public: testSDL(QWidget *parent = Q_NULLPTR):_window(nullptr), _pScreens(nullptr),_pload(nullptr) { ui.setupUi(this); Init(); startTimer(50); } ~testSDL() { SDL_FreeSurface(_pload); SDL_DestroyWindow(_window); SDL_Quit(); } void Init() { if (SDL_Init(SDL_INIT_EVERYTHING) < 0) { cout << "SDL_Init failed" << endl; return; } _window = SDL_CreateWindowFrom((void*)this->winId()); if (!_window) { cout << "DL_CreateWindowFrom failed" << endl; return; } } void timerEvent(QTimerEvent *event) { _pScreens = SDL_GetWindowSurface(_window); if (!_pScreens) { cout << "SDL_GetWindowSurface failed" << endl; } _pload = SDL_LoadBMP("test.bmp"); if (!_pload) { cout << "SDL_LoadBMP failed" << endl; return; } SDL_BlitSurface(_pload, NULL, _pScreens, NULL); if (SDL_UpdateWindowSurface(_window) < 0) { cout << "SDL_UpdateWindowSurface failed" << endl; } } private: Ui::testSDLClass ui; SDL_Window *_window; SDL_Surface *_pScreens; SDL_Surface *_pload; };
原先是在QPaintEvent中绘制的,可是图片只显示一下就没了,并无达到效果,缘由多是将sdl绘制嵌入qt后,qt窗口的焦点被sdl抢占的缘由。因此这里改用定时器绘制。
人生苦短,总结不易,若是这篇文章能够帮助到你,请轻轻移动一下鼠标,把它顶(赞)起来,分享给更多的须要的伙伴。