ffmpeg播放器实战(进度条ui)

简介: 进度条ui

1.构造函数:

Progress::Progress(QWidget*parent)
    : QWidget{parent}
{
//setMouseTracking是一个 Qt 框架中的功能,用于启用或禁用鼠标跟踪。当该功能启用时,窗口将会跟踪鼠标的移动,并发送相应的鼠标事件。这样可以实现一些与鼠标相关的交互操作,如鼠标悬停、拖拽等。//在使用时,需要先获取一个 QWidget 对象的指针,然后调用其setMouseTracking方法来设置鼠标跟踪的状态。例如://Widget *widget = new QWidget;//widget->setMouseTracking(true); // 启用鼠标跟踪// 或者禁用鼠标跟踪// widget->setMouseTracking(false);//通过设置setMouseTracking(true)来启用鼠标跟踪,设置setMouseTracking(false)来禁用鼠标跟踪。启用后,当鼠标在该窗口内移动时,窗口将会收到鼠标移动事件,从而可以做出相应的处理。//需要注意的是,setMouseTracking只能用于 QWidget 及其派生类的对象,不能直接用于其他对象。this->setMouseTracking(true);
}

作用:为了开启鼠标追踪效果

2.重绘函数

voidProgress::paintEvent(QPaintEvent*)
{
intwidth=this->width() -2*MY_BORDER_WIDTH;
intheight=this->height();
QPainterpainter(this);
//setRenderHint 是一个用于设置绘图选项的函数。它可以用来改变绘图的外观和性能。//该函数接受两个参数,第一个参数是一个 QPainte n::RenderHint 类型的枚举值,//表示要设置的绘图选项。第二个参数是一个布尔值,表示该选项是否启用。//启用抗锯齿渲染painter.setRenderHint(QPainter::Antialiasing);
//Qt::NoPen是Qt框架中的一个枚举值,它用于指定不使用画笔绘制图形元素。//在绘制图形时,可以使用不同的画笔样式来定义边框线条的样式,包括颜色、宽度和样式等。//当设置为Qt::NoPen时,表示不使用任何画笔,即没有边框线条。//这个枚举值常用于需要绘制无边框的图形元素,//比如绘制填充区域或者背景色等。//通过将画笔设置为Qt::NoPen,可以让图形元素只显示填充效果,而没有边框线条。//在使用Qt进行图形绘制时,可以通过QPainter类的setPen()方法来设置画笔,//其中可以传入Qt::NoPen来指定不使用画笔。painter.setPen(Qt::NoPen);
painter.setBrush(QColor(255,0,0));
painter.drawRect(MY_BORDER_WIDTH, 0, width, height);
if (sliderLength<=0)
return;
painter.setBrush(QColor(255, 165, 50));
painter.drawRect(MY_BORDER_WIDTH, 0, width*sliderValue/sliderLength, height);
}

3.鼠标事件

image.png

voidProgress::dealPos(intpos)
{
//如果长度小于0if (sliderLength<=0)
return;
//宽度intwidth=this->width() -2*MY_BORDER_WIDTH;
if (pos<MY_BORDER_WIDTH)
pos=MY_BORDER_WIDTH;
if (pos>width+MY_BORDER_WIDTH)
pos=width+MY_BORDER_WIDTH;
//分段doublestep= (double)width/sliderLength;
//值doublevalue= (double)(pos-MY_BORDER_WIDTH) /step;
doubleoffset=value-int(value);
intrealValue=int(value);
if (offset-0.5>=0)
realValue++;
if (sliderValue!=realValue) {
sliderValue=realValue;
emitsignalValue(realValue);
this->update();
    }
}

4.其他函数

//设置长度voidProgress::setSliderLength(intvalue)
{
sliderLength=value;
}
voidProgress::setSliderValue(intvalue)
{
//如果不按下if (!pressFlag) {
sliderValue=value;
//QWidget的update()函数是用来更新窗口的显示。//当调用update()函数时,会触发窗口的重绘事件,使窗口进行重新绘制。//这个函数通常用于在程序运行过程中需要更新窗口内容时调用,//比如改变窗口的大小、位置、背景色等。调用update()函数后,//系统会自动调用QWidget的paintEvent()函数进行窗口的重新绘制。this->update();
    }
}
intProgress::getSliderValue()
{
returnsliderValue;
}
//是否按下boolProgress::getPressFlag()
{
returnpressFlag;
}
相关文章
|
17天前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
78 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
3月前
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
63 0
|
3月前
|
前端开发 开发者 开发框架
JSF与Bootstrap,打造梦幻响应式网页!让你的应用跨设备,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,响应式设计至关重要,以确保不同设备上的良好用户体验。本文探讨了JSF(JavaServer Faces)与Bootstrap框架的结合使用,展示了如何构建响应式网页。JSF是一个基于Java的Web应用框架,提供丰富的UI组件和表单处理功能;而Bootstrap则是一个基于HTML、CSS和JavaScript的前端框架,专注于实现响应式设计。通过结合两者的优势,开发者能够更便捷地创建自适应布局,提升Web应用体验。然而,这种组合也有其局限性,如JSF组件库较小和较高的学习成本等,因此在选择开发框架时需综合考虑具体需求和应用场景。
47 0
|
4月前
|
JavaScript
vue + element UI【实战】音乐播放器/语音条(内含音频的加载、控制,事件监听,信息获取,手机网页阴影的去除等技巧)
vue + element UI【实战】音乐播放器/语音条(内含音频的加载、控制,事件监听,信息获取,手机网页阴影的去除等技巧)
70 1
|
4月前
Element UI【实战范例】下拉选择 el-select 的 change 事件传入选中值+自定义参数
Element UI【实战范例】下拉选择 el-select 的 change 事件传入选中值+自定义参数
683 1
|
4月前
Element UI 【表格合计】el-table 实战范例 -- 添加单位,自定义计算逻辑
Element UI 【表格合计】el-table 实战范例 -- 添加单位,自定义计算逻辑
385 0
|
4月前
|
JavaScript BI UED
vue + element UI【实战】打字闯关(含按键监听、按键音效、字符匹配、动态样式、结果判定、数据统计、音效获取和剪辑等实用技巧)
vue + element UI【实战】打字闯关(含按键监听、按键音效、字符匹配、动态样式、结果判定、数据统计、音效获取和剪辑等实用技巧)
49 0
|
24天前
|
编解码 语音技术 内存技术
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
《FFmpeg开发实战:从零基础到短视频上线》一书中的“5.1.2 把音频流保存为PCM文件”章节介绍了将媒体文件中的音频流转换为原始PCM音频的方法。示例代码直接保存解码后的PCM数据,保留了原始音频的采样频率、声道数量和采样位数。但在实际应用中,有时需要特定规格的PCM音频。例如,某些语音识别引擎仅接受16位PCM数据,而标准MP3音频通常采用32位采样,因此需将32位MP3音频转换为16位PCM音频。
42 0
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
|
29天前
|
XML 开发工具 Android开发
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
ExoPlayer最初是为了解决Android早期MediaPlayer控件对网络视频兼容性差的问题而推出的。现在,Android官方已将其升级并纳入Jetpack的Media3库,使其成为音视频操作的统一引擎。新版ExoPlayer支持多种协议,解决了设备和系统碎片化问题,可在整个Android生态中一致运行。通过修改`build.gradle`文件、布局文件及Activity代码,并添加必要的权限,即可集成并使用ExoPlayer进行网络视频播放。具体步骤包括引入依赖库、配置播放界面、编写播放逻辑以及添加互联网访问权限。
115 1
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
|
1月前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
58 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势