一、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搶佔的緣由。因此這裏改用定時器繪製。
人生苦短,總結不易,若是這篇文章能夠幫助到你,請輕輕移動一下鼠標,把它頂(贊)起來,分享給更多的須要的夥伴。