当前位置: 首页 > news >正文

QT 简易音乐播放器

目录

放置控件

获取mp3文件

播放音乐

准备工作

加载模块

加载头文件

new一个output对象,Mediaplayer对象

    把outpout对象交给mediaplayer对象    

给播放器设置音乐

播放

优化

上一曲下一曲功能

 双击歌曲播放

获取音乐时长和音乐播放时间

让音乐进度条跟随音乐走

调节音乐进度条更改音乐进度

音量调节

喇叭静音

音量进度条


放置控件

获取mp3文件

首先我们需要点击文件夹按钮的时候弹出一个新界面.因此我们需要QFileDialog类,这个函数就是新增一个界面.然后我们需要调QFileDialog下的getExistingDirectory函数,也就是打开一个已经存在的文件夹.

getExistingDirectory函数的第一个参数是父节点,第二个参数是标题,第三个参数是文件夹路径.返回值是QString:

我们需要把这个字符串转为一个路径,我们可以将其强转为QDir类型,然后再通过entryList函数将该路径下目录里的mp3文件全部过滤出来.代入如下:

void MainWindow::on_explorer_clicked()
{// 弹出文件对话框,让用户选择音乐文件夹,默认路径为"D://QTproject//music//assert//Music"QString path = QFileDialog::getExistingDirectory(this, "请选择音乐", "D://QTproject//music//assert//Music");// 创建QDir对象,用于操作指定的目录QDir dir(path);// 获取目录下所有以".mp3"结尾的文件,存入QStringList对象QStringList musicList = dir.entryList(QStringList()<<"*.mp3");// 打印音乐列表,用于调试qInfo()<<musicList;// 将获取到的音乐文件列表添加到UI的listWidget组件中ui->listWidget->addItems(musicList);
}

接下来我们需要把获取到的mp3文件展示出来,我们在主界面上放置一个listWidget控件.然后向listWidget里添加我们将才获取到的mp3文件:

  ui->listWidget->addItems(musicList);

我们拉一个横向滑块作为音乐进度条,一个纵向滑块作为音量调节条:

播放音乐

准备工作

加载模块

QT       += core gui multimedia

加载头文件

#include<QMediaPlayer>  //播放器
#include<QAudioOutput>  //输出

new一个output对象,Mediaplayer对象

    //先new一个output对象auto audioOutput=new QAudioOutput(this);  //把内存交给当前窗口管理(即关闭当前窗口就析构)//再new一个Mediaplayer对象auto mediaplayer=new QMediaPlayer(this);

    把outpout对象交给mediaplayer对象    

    mediaplayer->setAudioOutput(audioOutput);

给播放器设置音乐

mediaplayer->setSource(QUrl::fromLocalFile("D:/QTproject/music/assert/Music/来一碗老于 - 解药 (Single Version).mp3"));

播放

mediaplayer->play();

现在选中文件之后就会自动播放mediaplayer指向的setSource里路径下的音乐.

但是我们的需求是通过我们的音乐播放按钮播放我们listwidget上选中的音乐.

优化

我们首先让光标默认选择默认选中第一首歌(即选中第一行)

ui->listWidget->setCurrentRow(0);

然后我们把音乐完整路径保存到qlist里

    QList<QUrl> playlist;  //全局变量,定义于.h文件for(auto file:musicList){playlist.append(QUrl::fromLocalFile(path+"/"+file));}

经过上面的步骤,所有的歌都存到playlist里面了

现在我们就可以通过播放按钮来播放音乐了(点击播放键调用playlist里和光标选中行一样下标的音乐)

//播放音乐按钮
void MainWindow::on_btn_play_clicked()
{//播放当前选中的音乐//获取选择的行int index=ui->listWidget->currentRow();//播放对应下标的音乐mediaplayer->setSource(playlist[index]);mediaplayer->play();
}

此时我们通过点击播放按钮可以达到播放音乐的效果,但是不能停止音乐.因此我们需要一个标志位,来标识当前是什么状态:

void MainWindow::on_btn_play_clicked()
{switch(mediaplayer->playbackState())  //播放器当前的播放状态{case QMediaPlayer::PlaybackState::PlayingState:  //播放状态{//正在播放音乐就暂停音乐mediaplayer->pause();break;}case QMediaPlayer::PlaybackState::PausedState:  //暂停状态{//暂停状态就播放音乐mediaplayer->play();break;}case QMediaPlayer::PlaybackState::StoppedState:  //停止状态{//停止状态就播放音乐//播放当前选中的音乐//获取选择的行int index=ui->listWidget->currentRow();//播放对应下标的音乐mediaplayer->setSource(playlist[index]);mediaplayer->play();break;}}
}

现在我们就可以自由控制播放暂停音乐了.

上一曲下一曲功能

上一曲

上一曲就是让listWidget选择上一行,然后playlist下标--

void MainWindow::on_btn_left_clicked()
{CurIndexPlay--;if(CurIndexPlay<0)CurIndexPlay=playlist.size()-1;  //防止下标越界ui->listWidget->setCurrentRow(CurIndexPlay);mediaplayer->setSource(playlist[CurIndexPlay]);mediaplayer->play();
}

下一曲

下一曲就是让ListWidget选择下一行,然后playlist下标++

void MainWindow::on_btn_right_clicked()
{//下一曲就是让Listwidget选择下一行//mediaplay下标++CurIndexPlay=(CurIndexPlay+1)%playlist.size();  //为了防止下标越界ui->listWidget->setCurrentRow(CurIndexPlay);mediaplayer->setSource(playlist[CurIndexPlay]);mediaplayer->play();
}

 双击歌曲播放

我们重写listwidget的双击槽函数  void on_listWidget_doubleClicked(const QModelIndex &index);

void MainWindow::on_listWidget_doubleClicked(const QModelIndex &index)
{CurIndexPlay=index.row();mediaplayer->setSource(playlist[CurIndexPlay]);mediaplayer->play();
}

这样我们就可以双击歌曲直接播放了

获取音乐时长和音乐播放时间

获取当前音乐播放时长必须通过信号与槽来获取

现在就可以显示当前正在播放的音乐的进度时间和音乐总时长

让音乐进度条跟随音乐走

现在我们让进度条跟随音乐进度:

现在进度条就可以跟着音乐走了:"

调节音乐进度条更改音乐进度

connect(ui->playCourseSlider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setPosition);

音量调节

可以看到ui中有一个喇叭,旁边有一个进度条,我们实现拖动进度条改变音量,而直接点击喇叭则静音,再次点击喇叭开音.
1.进度条右键,选择valueChange()槽函数,注意不要选两个参数的。

喇叭静音

//拖动音量进度条改变声音
void MainWindow::on_Sound_heigorlow_valueChanged(int value)
{audioOutput->setVolume(value);
}

音量进度条

已经有一个名为audioOutputQAudioOutput对象,以及一个名为btn_sound的按钮。

首先,您需要在MainWindow类中添加一个成员变量来跟踪当前的静音状态:

// MainWindow类的私有部分
QAudioOutput *audioOutput; // 假设您已经有一个QAudioOutput对象
bool isMuted = false; // 用于跟踪是否静音// 在构造函数或初始化代码中连接按钮信号
connect(ui->btn_sound, &QPushButton::clicked, this, &MainWindow::toggleMute);

然后,实现toggleMute槽函数:

void MainWindow::toggleMute()
{// 切换静音状态isMuted = !isMuted;// 设置音量以反映新的静音状态if (isMuted) {// 如果是静音状态,则设置音量为0audioOutput->setVolume(0.0);} else {// 如果不是静音状态,则设置音量为1(或者您希望的非静音音量)audioOutput->setVolume(1.0);}
}

因为我们不想让音量条一开始就显示出来,又因为qslide没有visible属性.所以我们只能在MainWindow的构造函数或初始化函数中设置滑块为隐藏状态

ui->Sound_heigorlow->setVisible(false);

这样,音量条初始时就不会显示出来了:

相关文章:

QT 简易音乐播放器

目录 放置控件 获取mp3文件 播放音乐 准备工作 加载模块 加载头文件 new一个output对象,Mediaplayer对象 把outpout对象交给mediaplayer对象 给播放器设置音乐 播放 优化 上一曲下一曲功能 双击歌曲播放 获取音乐时长和音乐播放时间 让音乐进度条跟随音乐走 调…...

代码随想录八股训练营day32

代码随想录八股训练营day32 1、synchronized和lock的区别是什么 &#xff08;1&#xff09;synchronized和lock的区别是什么 synchronized和Lock都是Java中用于实现线程同步的手段&#xff0c;synchronized是Java的关键字&#xff0c;基于JVM的内置锁实现&#xff0c;可以用于…...

11.面试题——消息队列RabbitMQ

1.RabbitMQ是什么&#xff1f;特点是什么&#xff1f; RabbitMQ是一种开源的消息队列中间件&#xff0c;用于在应用程序之间进行可靠的消息传递。它实现了AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议&#xff0c;提供了强大的消息处理能力。RabbitMQ的…...

MySQL运维-日志

错误日志 二进制日志 介绍 日志格式 日志查看 日志删除 查询日志 慢查询日志...

synchronized重量级锁的实现原理是怎样的

重量级锁&#xff08;Heavyweight Locking&#xff09;是 Java 中 synchronized 关键字的锁机制的一部分&#xff0c;用于在高竞争情况下确保线程的同步。重量级锁主要通过操作系统的线程同步机制实现&#xff0c;通常涉及阻塞线程、上下文切换等开销较大的操作。以下是重量级锁…...

探索 GLTF 的世界:3D 内容的未来

在 3D 内容创作领域&#xff0c;GLTF 正在掀起波澜&#xff0c;成为跨不同平台提供丰富互动体验的未来标准。GL 传输格式 &#xff08;GLTF&#xff09; 由 Khronos Group 开发&#xff0c;是一种用于在工具和服务之间传输 3D 模型和场景的开放标准。它设计紧凑、高效且易于集成…...

【深度学习】【语音】TTS, CM-TTS,TTS扩散模型,论文

CM-TTS: Enhancing Real Time Text-to-Speech Synthesis Efficiencythrough Weighted Samplers and Consistency Models CM-TTS: 提高实时文本到语音合成效率 通过加权采样器和一致性模型 Xiang Li 1, Fan Bu 1, Ambuj Mehrish 2, Yingting Li 1, Jiale Han 1, Bo Cheng 1, S…...

【网络协议】网络劫持 - ARP_DNS欺骗篇

前言 网络劫持是一种网络攻击技术&#xff0c;攻击者通过拦截、篡改或重定向数据流量&#xff0c;控制用户的网络通信路径&#xff0c;干扰正常的网络服务。其方式可能包括DNS劫持、ARP欺骗和HTTP劫持等。通过这些手段&#xff0c;攻击者可以窃取敏感信息如个人身份数据和财务信…...

Linux 系统框架分析(一)

一、linux内核结构框图 对内核结构框图有个总体的把握&#xff0c;有助于理解为什么驱动要这样写&#xff0c;为什么写的应用程序所用的C库接口能够产生这么多的事情。 框图可以看出来&#xff0c;linux系统&#xff0c;包括五个系统 一、Linux内核结构介绍 Linux 内核是操作…...

Leetcode 剑指 Offer II 090.打家劫舍 II

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 一个专业的小偷&#xff0c;计划偷窃一个环形街道上沿街的房屋&a…...

上海冷链配送新篇章 华鼎冷链科技以卓越服务餐饮品牌

在快速发展的上海餐饮连锁行业中&#xff0c;冷链运输作为保障食品安全与品质的关键环节&#xff0c;正迎来前所未有的发展机遇与挑战。华鼎冷链科技作为该领域的佼佼者&#xff0c;正引领着上海乃至全国冷链运输行业的新风尚。 华鼎冷链科技的成功并非一蹴而就。首先&#xff…...

学习鸿蒙-应用市场申请签名

1.需要的文件概念 .cer / .p7b / .p12 / .csr HarmonyOS应用/服务通过数字证书&#xff08;.cer文件&#xff09;和Profile文件&#xff08;.p7b文件&#xff09;来保证应用/服务的完整性。在申请数字证书和Profile文件前&#xff0c;首先需要通过DevEco Studio来生成密钥&am…...

LayUi插件

文档&#xff1a;日期和时间组件文档 - Layui layDate安装 npm install layui-laydate...

使用tailwindcss轻松实现移动端rem适配

本示例节选自小卷全栈开发实战系列的《Vue3实战》。演示如何用tailwindcss所支持的rem体系轻松实现一个仿b站移动端头部导航栏rem适配。 友情声明 学习分享不易&#xff0c;如果小伙伴觉得有帮助&#xff0c;点赞支持下。满30赞&#xff0c;将随文附赠录屏讲解&#xff0c;感谢…...

2021-11-08 51单片机2位秒表启动清零

缘由c51单片机&#xff0c;程序&#xff0c;仿真图&#xff0c;求帮助-编程语言-CSDN问答 #include "REG52.h"sbit K1 P1^0; sbit K2 P1^1; sbit K3 P1^2; sbit K4 P1^3; sbit P1_0P2^0; sbit P1_1P2^1; sbit P1_2P2^2; sbit P1_3P2^3; sbit P1_4P2^4; sbit P1_…...

谈基于大语言模型的图数据库路径检索

随着微软已经开源了GraphRAG项目的代码&#xff0c;基于图数据库的RAG 热度迅速升温。关注基于大语言模型与图模型数据库相结合的技术的人多了起来。 本文提出了一种类似人工搜索的“顺藤摸瓜”方法&#xff0c;实现图数据库的智能搜索方法。 本地私有数据存储和查询 本地私有…...

XHTML 简介

XHTML 简介 XHTML&#xff0c;即“可扩展超文本标记语言”&#xff08;eXtensible HyperText Markup Language&#xff09;&#xff0c;是一种基于XML的标记语言&#xff0c;旨在取代HTML作为网页内容的标准格式。XHTML继承了HTML的基本结构&#xff0c;但更加严格和规范&…...

驱动开发系列10 - Linux Graphics 图形栈介绍

目录 一:Linux 图形栈总体结构 1. 整体图形栈: 2. 现代3D图形栈: 二:Xorg 介绍 Xorg 概述: Xorg的发展历史: Xorg绘制原理: Xorg的缺点: 三:Wayland 介绍 一:Linux 图形栈总体结构 1. 整体图形栈: 应用程序->桌面环境->GUI框架->Display Client->Displ…...

Docker快速入门指南

&#x1f6e0;️ Docker 应用场景 Docker 是一个开源的平台&#xff0c;旨在简化应用程序的开发、部署和管理。它通过容器技术&#xff0c;将应用及其所有依赖打包在一个标准化的环境中&#xff0c;从而确保应用在不同环境中的一致性和可移植性。在 Python 爬虫的场景中&#…...

VS Code中使用MSVC编译C++程序

前置条件 1. VS Code配置C开发环境 2. CMake安装 3. VS安装&#xff08;MSVC编译器&#xff09; 4. 环境变量配置&#xff08;重要&#xff01;&#xff01;&#xff01;&#xff09; ​​​​使用msvc的cl工具编译程序&#xff0c;以及 “fatal error C1034: iostream: 不包括…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...