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

GraphRAG大模型在药物发现中玩出新花样!揭秘潜在知识图谱的惊人能力!

本文深入探讨了Microsoft GraphRAG在药物发现领域的应用&#xff0c;通过构建科学文献的潜在知识图谱&#xff0c;测试了其检索和合成能力。实验揭示了LLM在处理复杂查询中的优势与局限&#xff0c;强调了语料质量和LLM选择的重要性。GraphRAG展现了高效从非结构化数据中提取洞…...

智能家居设备变“聪明”的秘密:我是如何给ESP32摄像头加上本地人脸识别功能的

给ESP32摄像头装上“大脑”&#xff1a;我的本地人脸识别开发实战 去年夏天&#xff0c;我家门铃摄像头频繁误报的困扰让我萌生了一个想法——为什么不能让它像人类一样"认出"熟面孔&#xff1f;市面上的智能摄像头要么依赖云端计算导致延迟高&#xff0c;要么隐私保…...

Verilog有限状态机实战:5分钟搞定红绿灯控制器(附完整代码)

Verilog有限状态机实战&#xff1a;从红绿灯控制器掌握FPGA设计精髓 红绿灯控制器是数字电路设计的经典案例&#xff0c;也是学习Verilog有限状态机&#xff08;FSM&#xff09;的最佳切入点。作为FPGA初学者&#xff0c;你可能已经看过各种理论讲解&#xff0c;但真正动手时依…...

保姆级教程:在CentOS 8 Stream上从零部署Zabbix 6.4监控系统(Nginx+MariaDB 10.6+PHP 7.4)

企业级监控系统实战&#xff1a;CentOS 8 Stream上部署Zabbix 6.4全栈指南 在数字化转型浪潮中&#xff0c;IT基础设施监控已成为企业运维的核心支柱。Zabbix作为开源监控领域的标杆产品&#xff0c;其6.4版本带来了更强大的自动发现机制和可视化功能。本文将手把手带您完成从裸…...

程序员的“无用论”:为什么你觉得数据结构与算法没用?

在计算机科学的学习过程中&#xff0c;数据结构与算法&#xff08;DSA&#xff09;常常被视为“面试敲门砖”。许多本科生甚至从业多年的开发者都会产生疑问&#xff1a;“我每天的工作就是 CRUD&#xff08;增删改查&#xff09;和调 API&#xff0c;为什么还要花那么多时间去…...

STM32F407实战:用CubeMX+FreeRTOS+SDIO+FatFs,5分钟搞定SD卡文件读写

STM32F407实战&#xff1a;5分钟极速实现SD卡文件系统全流程 拿到一块STM32F407开发板时&#xff0c;如何快速验证SD卡文件读写功能&#xff1f;这套组合方案或许能帮你省下大量调试时间——CubeMX生成基础框架、FreeRTOS管理任务调度、SDIO硬件接口驱动配合FatFs文件系统&…...

Qwen3.5-9B教程:Gradio队列机制+并发请求限流配置方法

Qwen3.5-9B教程&#xff1a;Gradio队列机制并发请求限流配置方法 1. 模型概述与环境准备 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型&#xff0c;具备强大的逻辑推理、代码生成和多轮对话能力。其多模态变体Qwen3.5-9B-VL支持图文输入&#xff0c;并能处理长达128K token…...

【微知】Mellanox网卡配置异常?mlxconfig reset全解与实战场景指南

1. Mellanox网卡配置异常&#xff1f;先别慌 遇到Mellanox网卡配置异常时&#xff0c;很多工程师第一反应是重装驱动或者更换硬件。其实在大多数情况下&#xff0c;用对mlxconfig reset这个神器就能快速解决问题。我处理过上百台配备Mellanox网卡的服务器&#xff0c;发现80%的…...

5大维度解析zteOnu:让ONU设备管理效率提升300%的开源工具

5大维度解析zteOnu&#xff1a;让ONU设备管理效率提升300%的开源工具 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 问题引入&#xff1a;网络运维工程师的日常困境 你是否也曾面临这…...

VASP表面建模进阶:利用现代脚本工具实现Slab模型原子选择性固定(POSCAR高效处理)

1. 为什么需要自动化处理POSCAR文件 在计算材料学领域&#xff0c;VASP作为第一性原理计算的黄金标准工具&#xff0c;其输入文件POSCAR的准确性直接决定了计算结果的可靠性。传统手动处理方式存在几个致命缺陷&#xff1a;首先&#xff0c;用Excel手工标记原子固定状态极易出错…...