SDL嵌入qt窗口绘制图片

   日期:2020-11-08     浏览:113    评论:0    
核心提示:1、SDLSDL用C编写,可与C ++一起使用,并且可用于其他几种语言,如C#和Python,支持Windows,Mac OS X,Linux,iOS和Android,是一套开放源代码的跨平台开发库。SDL多用于开发媒体播放器、游戏等多媒体应用领域。首先需要下载SDL,引入其头文件和库SDL下载地址:http://www.libsdl.org/因为我是用vs2015开发,所以下载的是上面这个。首先在代码中需要引入SDL头文件和库。#include "SDL.h"#unde

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抢占的原因。所以这里改用定时器绘制。

人生苦短,总结不易,如果这篇文章可以帮助到你,请轻轻移动一下鼠标,把它顶(赞)起来,分享给更多的需要的伙伴。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服