Qt实现 SDL嵌入Qt窗口中绘制图片

在Qt中搭建SDL2开发环境详细教程 1、进入SDL官网2、点击右上角进入下载页面(可能需要更科学的方式,自行解决)3、根据你的Qt构建套件下载我的套件是MinGW所以就下载minggw版本,点击后会自动进行下载4、解压到D盘(建议放在装软件的地方),然后将bin目录添加到环境变量到这里就安装完成,接下来可以去qt里面测试。 阅读详情

目录

1、SDL介绍

2、实现效果

3、主要函数的作用

4、主要代码

5、完整代码

6、总结


1、SDL介绍

SDL用C编写,可与C ++一起使用,并且可用于其他几种语言,如C#和Python,

支持Windows,Mac OS X,Linux,iOS和Android,是一套开放源代码的跨平台开发库。

SDL多用于开发媒体播放器、游戏等多媒体应用领域,不仅支持绘制图片,还支持播放视频、音频,

它的底层实际是封装了opengl和directx,使用gpu渲染,不会占用过多的cpu。

首先需要下载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、实现效果

3、主要函数的作用

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):

将窗口复制到屏幕上

4、主要代码

//初始化
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;
	}
}

 

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;
};

6、总结

原先是在QPaintEvent中绘制的,但是图片只显示一下就没了,并没有达到效果,原因可能是将sdl绘制嵌入qt后,qt窗口的焦点被sdl抢占的原因。所以这里改用定时器绘制。

其实qt内部提供了QPaint绘制图像,但是qimage显示图像,需要将数据转为rgb格式,这是一个很耗时的操作,在4K的电脑显示器,显示图像就很吃力了,如果是视频的图像帧,

那么会很卡顿,所以选择sdl来做。当前qt也有QOpenglWidget,不过使用起来并没有sdl方便。

 

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

QT+SDL2环境搭建,保姆教程 SDL2+ffmpeg 阅读详情

相关推荐

Qt 性能优化:绘制视频方案选择

我们只需要把少部分的区域绘制出来,不用绘制整个图标的数据,所以需要定义一个 viewport。如果嵌入式板子有 GPU,则使用 EGLFS 平台插件,最推荐使用 Qt 官方自带的 QOpenGLWidget 来绘图;如果没有 GPU,一般只能使用 LinuxFB 平台插件,推荐使用 SDL、OpenCV 等第三方库;如果不想使用第三方库的话,那只能使用 QPainter 实现绘图了,就要注意优化了,否则 CPU 占用率很容易偏高。

QtCompany的博客 931

SDL教程(二)——Qt+SDL播放器

​ 这篇文章主要是使用SDL来打开视频,显示视频。后续会再继续使用SDL来结合FFmpeg。来能够直接使用网上的demo进行学习。Qt 5.15.2 MSVC2019 64bitWin11Qt搭建,我觉得相比用VS2019来说,更为方便,至少你后面再新建一个项目的时候,很多代码直接拷过去就可以了,不用每次都去点属性页。确实,也可以在VS2019上搭建一个通用属性页,到哪里,就拷贝到哪,这倒也是一种方法。1、肯定就是还是那些库,关于下载的可以去参考第一篇文章:SDL教程(一)——开发环境2、Qt pro文件中

保持一颗敬畏之心,简单地调用C++,适当地向C++妥协,让以后的自己看懂代码,让别人看懂代码。 1611

Qt 性能优化 现象和解决方案

在最近的项目中,发现执行 Qt 程序时,有些情况下的 CPU 占用率奇高,最高高达 100%。项目跑在嵌入式板子上,最开始使用 EGLFS 插件,但是由于板子没有单独的鼠标层,导致鼠标移动起来卡顿,很不流畅,所以换成了 LinuxFB 插件。但是如果 CPU 占有率高了的话,也会导致鼠标卡顿,因为鼠标是由 Qt 应用程序层负责绘制的,如果应用程序 CPU 占有率高了的话,也会导致鼠标绘制缓慢,导致鼠标卡顿。

m0_73482095的博客 3424

QT使用经验总结

1、和配置其他第三方库一样.pro中需要配置 .h 和 .lib 的路径 2、.h 中需要配置SDL.h SDL_thread.h SDL_main.h 三个头文件 3、如果入口函数是int main(int argc, char *argv[])则不用加 #undef main; 4、如果入口函数是int main()则需要加#undef main; 5、注意勤进行清理工作 6、代码 UI主线程创建窗口 子线程刷新画面...

大道至简 1007

QT中嵌入SDL

前段时间在做一个音视频编码板卡的PC跨平台程序,使用QT框架,其中有块功能是往QT里嵌入SDL,来播放YUV格式帧数据,现在已经在windows和linux下完成。 我浏览论坛的时候,发现好多同僚在做我以前的准备工作。在这里我把我的一些经验写出来,希望对这些同僚有点帮助,当然可能有有一些错误,请指出来,大家一起进步。 一. yay-20060421-2.zip这个包是一个使用SDL的YUV的播放器源代码,在Linux下可用。 二. 至于往QT里嵌入SDL,你可以这样 这个是.pro文件部分代码: unix

我不是码农的博客~~~ 2170

SDL —— 将sdl渲染画面嵌入Qt窗口显示(附:源码)

SDL —— 将sdl渲染画面嵌入Qt窗口显示(附:源码)

380

mac 中qt获取窗口_SDL初识嵌入Qt窗口中实时绘制图片

目录1、SDL介绍2、实现效果3、主要函数的作用4、主要代码5、完整代码6、总结1、SDL介绍SDL用C编写,可与C ++一起使用,并且可用于其他几种语言,如C#和Python,支持Windows,Mac OS X,Linux,iOS和Android,是一套开放源代码的跨平台开发库,功能强大,在音视频开发领域经常被使用到。SDL多用于开发媒体播放器、游戏等多媒体应用领域,不仅支持绘制图片...

weixin_36299242的博客 656

Qt 性能优化之一:选择合适的视频渲染方案

Qt 性能优化之一:选择合适的视频渲染方案

草上爬的博客 3370

将OpenCV输出的图像嵌入显示到子窗口控件中(支持Windows、Linux)

OpenCV用来做视频处理很方便,能用窗口显示处理后的图像,但是它默认显示图像的窗口是弹出式的,而我们很多情况下需要将图像显示到自己软件的窗口控件中。这应该怎么做呢?上网搜过一些方案,也试了一下,最后自己优化了一下,把其中几种比较靠谱的方法分享给大家。 第一种,使用Cvvimage类 + GDI方式显示图像。 CvvImage类有个函数DrawPicToHDC (IplImage *img, ...

爱写代码的自由人 3654

用Qt+FFmpeg+SDL构建播放器:从解码到渲染的实战指南

音视频播放是多媒体开发中的典型场景,涉及解封装、解码、渲染与同步等多个技术环节。FFmpeg作为业界领先的多媒体处理库,负责将各种格式的媒体流解析并解码为原始音视频帧;SDL则专注跨平台的图形与音频输出,提供高效的纹理渲染和音频队列机制;而Qt凭借成熟的界面框架和事件系统,成为播放器控制的理想载体。三者结合时,需要重点解决线程模型划分、队列积压控制、PTS时间戳同步以及SDL窗口嵌入QWidget等工程问题。本文从播放器的基本职责边界出发,深入分析解码线程与界面线程的协作方式,讲解FFmpeg解码链路搭建、

weixin_29193259的博客 266

QT5集成SDL2实现BMP图像显示完整示例

通过调整SDL_Rect的成员,可灵活控制图像位置与大小。// 放大 1.5 倍// 居中return dst;// 使用方式:结合 DPI 缩放因子(来自 Qt 的),可在高清屏上保持清晰度。

weixin_31720909的博客 1288

在QT5中搭建SDL2环境以及显示bmp图片

在VisualStudio 2012中配置SDL可以参考这篇文章:SDL2学习笔记1-环境搭建以及HelloSDL         将SDL窗口嵌入MFC总可以参考这篇文章:在MFC中使用SDL2.0(SDL窗口嵌入到MFC中)         本文测试环境:win764位 + Qt5 + SDL2 ;         第一步,下载Windows下SDL2的库文件。在这里下载,如

hjl240的专栏 1万+

Qt+FFmpeg+SDL音视频播放器实战:从毕设到工业级源码

音视频播放器是多媒体开发的基础工程实践,其核心在于解复用、软解码、同步渲染与跨平台调度四大技术环节。基于FFmpeg实现音视频解码与时间戳管理,结合SDL完成GPU加速的YUV纹理渲染和音频PCM缓冲控制,再由Qt统一协调事件循环、窗口生命周期与UI交互,构成稳定可控的‘解码-队列-同步-渲染’流水线。该方案规避了纯QPainter渲染的CPU瓶颈、动态库依赖的部署风险及线程安全导致的卡顿崩溃,特别适合毕业设计落地与音视频工程师补全底层链路认知。文中详述Qt、FFmpeg、SDL三者协同机制与静态编译实践。

weixin_29175469的博客 311

qt 嵌入窗口_嵌入式Linux轻量级图形应用库应该如何设计

合作微信:xydf321456Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。嵌入式Linux系统的很多应用领域,诸如消费类电子产品、测量控制设备等,...

weixin_39830175的博客 279

Unity新手必看:5分钟搞定TextMeshPro中文乱码,告别小方块(附7000+常用字库)

本文详细介绍了Unity中TextMeshPro中文乱码问题的解决方案,包括快速生成中文字体的步骤和优化技巧。通过使用支持中文的.ttf字体文件和自定义字符集,开发者可以在5分钟内解决TMP显示小方块的问题,提升游戏或应用的文本显示效果。

weixin_33095355的博客 362

Gem5模拟器,详解官网教程Event-driven programming(五)

Gem5模拟器,详解官网教程Event-driven programming、时间调度、如何自定义SimObject

qq_46675545的博客 2038

SDL结合QWidget的简单使用说明(2)

上篇主要讲了针对yv12流数据的渲染,但有时候我们显示视频还要求加一些信息,比如头像,昵称等等。一般的想法是在渲染窗口之上做一个小控件来负责; 但是很遗憾,你会发现你的控件被SDL的渲染完全遮住了,渲染的原理并非是在本窗口的刷新做,而是另外有一层负责,这也是为什么上篇强调一定要setUpdateEnabled(false)的原因 那么只有考虑再渲染层直接把图片文字贴出来的办法。这么简...

a1115873361的博客 359

python电子学会三级的零碎笔记

‌示例‌:如果s = ['a', 'b', 'c'],则' '.join(s)+'\n'的结果是'a b c\n',写入文件时所有元素会在一行内显示,每个元素之间用空格分隔,末尾有一个换行符。(2) '\n'.join(s)‌:如果s = ['a', 'b', 'c'],则'\n'.join(s)的结果是'a\nb\nc',写入文件时每个元素会占据文件的一行。(1) ' '.join(s)+'\n'‌:这种方式首先将列表s中的每个元素通过空格连接成一个字符串,然后在字符串末尾添加一个换行符\n。

xzal12的博客 690

SDL2嵌入到Qwidget中

在网上看到许多人用qt做播放器只用了SDL2的音频部分,然后就图片刷新。这种方案好处是简单,坏处是没有利用到sdl2 的硬件加速。 搜了一下发现大多数没有这方面的记录,所以就写下这篇文章,直接上代码吧。 SDL_Window* sdlWindow = SDL_CreateWindowFrom((void*) (w.GetQWidget()->winId())); 这个就是利用SDL_Crea

WaitForDone的博客 4121

机器学习实例(预测房价中位数)(附代码)

1、下载数据: 下载一个压缩文件housing.tgz即可,其包含housing.csv(已经包含书有数据。),用 tax xzf housing.tgz 来解压提取CSV文件。 import os import tarfile import urllib.request DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml2/master/" HOUSING_PATH = os.path.join("datasets",

qq_51153436的博客 2755

PCB设计AD规则设置(按照嘉立创设置)

按照嘉立创的相关加工能力进行设置: 1.Hole Size(钻孔孔径) 嘉立创要求钻孔孔径在0.2-6.3mm,并给了公差(如下图给出了钻孔孔径和公差) 规则设置位置:Manufacturing->Hole Size,这里就改一下数值,最小设置为0.2mm,最大设置为6.3mm 2.Width(线宽) 嘉立创要求线宽多层板双层板最小为3.5mil,单双层板最小为5mil(如下图给出了线宽) 规则设置位置:Routing->Width,我目前只画过双层板,按我的设置如下,最小的线宽设置为10

subtitle_的博客 4万+

DVD subtitle stream in SDL(thinkvd开发日志)

<br />  在开发thinkvd dvd subtitle视频时,SDL中显示dvd字幕流,在ffplay.c中运行是正常的,但把它嵌入到QT中,再由SDL来显示就不行,跟踪了很久。<br /><br />   在字幕与视频合并的地方video_image_display(VideoState *is),把每帧都保存为png图片,发现在非嵌入QT情况下,它的每一帧带字幕的图片显示都正常,在嵌入情况下,只有少部分图片缺少字幕,应该来说也可以显示字幕。但字幕基本上只闪了一下。<br />在跟踪过程中发现一个

thinkvd dvd and video converter 1048

EtherCAT主站SOEM -- 24 -- 基于STM32F767IGT6搭建自己的SOEM-EtherCAT主站

以上就是EtherCAT主站SOEM – 23 – 基于STM32F767IGT6搭建自己的SOEM-EtherCAT主站的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 3550

嵌入式Linux常用GUI系统

嵌入式Linux常用GUI系统 【整理】嵌入式Linux中常用的GUI(图形用户界面)系统 Embeddedcrifan7年前 (2012-08-31)1502浏览0评论 网上找了一堆资料,还是这里: Embedded Linux Graphics System 的解释是,最新的,最全的,逻辑也是最清晰的。 所以,简单摘录其分类,并整理如下: 1.Linux中...

行知致简的专栏 9855

11、iOS设备逻辑数据分析全解析

本文深入解析iOS设备中的逻辑数据,涵盖图像相关数据库(Photos.sqlite和PhotosAux.sqlite)、录音文件、iPhoto照片存储结构、多媒体文件、第三方应用程序、社交网络应用(如Twitter、Skype、Facebook等)以及苹果相关应用(如Google Mobile、Bing)的数据存储结构和取证方法。此外,还介绍了文档类应用(如Pages、Numbers、Documents To Go)的文件存储结构及恢复方法。适用于iOS取证、数据挖掘和数字调查领域。

rain6的博客 226

ADS基础教程16 - 存档和导入(workspace、cell、view)

选择workspace_Archive目录作为保存workspace归档的目录,点击打开进行目录选择,点击Finish保存目录。,选择cell_Archive目录作为保存cell归档的目录,点击打开进行目录选择,点击Finish保存目录。,选择view_Archive目录作为保存view归档的目录,点击打开进行目录选择,点击Finish保存目录。(2)在弹框中,可以选择点击Select将参考的条目添加进来,然后点击Next…(2)在弹框中,可以选择点击Select将参考的条目添加进来,然后点击Next…

XZ_ZC的博客 3699
上一篇: c++设计模式汇总
下一篇: Qt实现 基于ffmpeg拉流播放视频
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值