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搶占的原因,所以這里改用定時器繪制,
人生苦短,總結不易,如果這篇文章可以幫助到你,請輕輕移動一下滑鼠,把它頂(贊)起來,分享給更多的需要的伙伴,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/205741.html
標籤:python
