当前位置: 首页 > 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: 不包括…...

Qwen3-Coder-30B-A3B-Instruct-FP8:终极代码模型对比分析指南

Qwen3-Coder-30B-A3B-Instruct-FP8&#xff1a;终极代码模型对比分析指南 【免费下载链接】Qwen3-Coder-30B-A3B-Instruct-FP8 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8 在当今AI代码生成领域&#xff0c;Qwen3-Coder-30B-…...

如何用deberta-v3-base-zeroshot-v2.0构建企业级NLP应用?完整教程来了

如何用deberta-v3-base-zeroshot-v2.0构建企业级NLP应用&#xff1f;完整教程来了 【免费下载链接】deberta-v3-base-zeroshot-v2.0 项目地址: https://ai.gitcode.com/hf_mirrors/NingBo_Ascend/deberta-v3-base-zeroshot-v2.0 deberta-v3-base-zeroshot-v2.0是一款基…...

Python 3.7 + XGBoost 多分类实战:从数据清洗到SHAP模型解释的保姆级教程

Python 3.7 XGBoost 多分类实战&#xff1a;从数据清洗到SHAP模型解释的保姆级教程在机器学习领域&#xff0c;XGBoost因其出色的性能和可解释性成为众多数据科学家的首选工具。本文将带您完整走过多分类任务的全流程&#xff0c;从原始数据到可解释的预测模型&#xff0c;每个…...

2026年,本地精准营销高性价比服务商来袭,你还不了解一下?

在本地商业竞争日益激烈的2026年&#xff0c;实体店面临着诸多挑战&#xff0c;引流难、成本高、复购率低等问题困扰着众多商家。而中粤&#xff08;广州&#xff09;信息科技有限公司作为本地精准营销的高性价比服务商&#xff0c;正以其独特的优势和卓越的服务&#xff0c;为…...

串口通信粘包问题:成因深度解析与项目实战解决方案

在嵌入式开发、工业工控、上位机下位机交互项目中&#xff0c;串口&#xff08;RS232/RS485&#xff09;是最基础、最常用的通信方式。绝大多数开发者都遇到过这样的问题&#xff1a;串口接收的数据偶尔错乱、解析报错、数据拼接异常&#xff0c;单次接收的数据时而半包、时而多…...

为Claude Code配置稳定API源并解决访问限制

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为Claude Code配置稳定API源并解决访问限制 Claude Code 作为一款强大的 AI 编程辅助工具&#xff0c;其原生服务在某些情况下可能…...

PCL 法向量夹角剔除错误匹配点对【2026最新版】

目录 一、 算法简介 1、主要函数 2、参考文献 二、 代码实现 三、 结果展示 四、 参考链接 博客长期更新,本文最新更新时间为:2026年5月24日。代码在PCL1.15.1中测试通过 一、 算法简介 在三维点云配准中,对应点(correspondence)的准确性直接决定了配准算法的精度和鲁棒性…...

从安装到排错:手把手解决Linux服务器上Nacos启动失败的十大常见问题

从安装到排错&#xff1a;手把手解决Linux服务器上Nacos启动失败的十大常见问题当你在Linux服务器上部署Nacos时&#xff0c;是否遇到过启动失败却无从下手的困境&#xff1f;作为阿里巴巴开源的服务发现和配置管理平台&#xff0c;Nacos在微服务架构中扮演着重要角色。然而&am…...

终极免费音乐解锁工具:5步轻松解密你的加密音乐文件

终极免费音乐解锁工具&#xff1a;5步轻松解密你的加密音乐文件 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https:/…...

【2026实测】怎么提高论文原创度?盘点8款主流降AI工具,附结构级优化指南

写文章最怕碰到什么&#xff0c;是辛辛苦苦自己码出来的字&#xff0c;却被标了极高的AI值。目前很多文本审核机制对内容的原创度要求极高&#xff0c;纯手写的初稿也可能因为句式太工整被判定为机器生成的。 为了帮几个快被这事折腾疯了的学弟学妹找条出路&#xff0c;我花了…...