SDL嵌入qt窗口繪製圖片

一、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搶佔的緣由。因此這裏改用定時器繪製。

人生苦短,總結不易,若是這篇文章能夠幫助到你,請輕輕移動一下鼠標,把它頂(贊)起來,分享給更多的須要的夥伴。

相關文章
相關標籤/搜索