1、SDL
SDL用C编写,可与C ++一起使用,并且可用于其他几种语言,如C#和Python,支持Windows,Mac OS X,Linux,iOS和Android,是一套开放源代码的跨平台开发库。
SDL多用于开发媒体播放器、游戏等多媒体应用领域。
首先需要下载SDL,引入其头文件和库
SDL下载地址:http://www.libsdl.org/
因为我是用vs2015开发,所以下载的是上面这个。
首先在代码中需要引入SDL头文件和库。
#include "SDL.h"
#undef main
#pragma comment(lib,"SDL2.lib")
#pragma comment(lib,"SDL2main.lib")
#pragma comment(lib,"SDL2test.lib")
加上#undef main的目的是为了防止出现以下错误
2、主要函数的作用:
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):将窗口复制到屏幕上
3、主要代码
//初始化
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;
}
}
4、效果
5、完整代码
#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抢占的原因。所以这里改用定时器绘制。
人生苦短,总结不易,如果这篇文章可以帮助到你,请轻轻移动一下鼠标,把它顶(赞)起来,分享给更多的需要的伙伴。