基于Qt的在线音乐播放器

2023-10-30

1.了解音乐播放器应该有哪些功能:

音乐播放器的各种控制(上下曲,单曲循环,随机播放,顺序播放),歌曲列表,歌词显示,本地音乐保存,在线音乐搜索,在线音乐播放。

2.制作Qt音乐播放器一定要了解QmediaPlayer和QmediaPlaylist。

使用QmediaPlaylist和QmediaPlayer需要工程文件里添加

QT += multimedia network;

QmediaPlaylist:

算是一个音乐链表,将mp3文件以链表形式添加进去。使用QmediaPlayer定义的类进行播放。默认是顺序播放,要想改变播放模式,操作如下:

QmediaPlaylist::setPlaybackMode用来设置播放模式,播放模式有:

循环(QMediaPlaylist::CurrentItemInLoop)、

顺序(QMediaPlaylist::Sequential)、

随机(QMediaPlaylist::Random)等;

由于类似链表,Playlist里面的歌曲都有一个下标(index)。QmediaPlaylist::CurrentIndex函数用来获取当前歌曲的下标,利用index控制播放哪一首歌。

QmediaPlayer:

当使用QmediaPlaylist定义一个Playlist,QmediaPlayer定义一个Player,

Player->setPlaylist(PlayList) 就可以对应Playlist里面的音乐。

再使用Player->play(),进行播放音乐。

QmediaPlayer可以实现简单的功能实现:

音乐暂停:

Player->pause();

音乐播放:

Player->play();

音乐停止:

Player->stop();

关于如何添加本地音乐文件:

 通过QFileDialog::getOpenFileNames去过滤文件,通过QDir::currentPath();获取当前文件路径进行初始化,文件过滤器筛选出“*.mp3”。使用for循环和

PlayList->addMedia(QUrl::fromLocalFile(path));逐渐将本地音乐添加到PlayList里面去。再让Player获取PlayList的内容,添加本地音乐算是完成了。

实现上下曲:

 

前面说过每首歌曲都有一个下标,通过下标可以实现对歌曲的控制。PlayList->currentIndex();可以获取当前歌曲下标,因此定义一个int类型num等于当前歌曲下标+1就可完成下一首操作,当num == PlayList里面总歌曲数时,再把num置零,实现最后一首下一首时转到第一首歌曲。上一首同理。

关于音乐音量的改变:

通过Player->setVolume(vol)改变音量大小;通过信号与槽,滑块滑动获得值vol,就可以实现滑块控制。

关于音乐进度的改变:

获取音乐进度条和改变进度条需要Player发送信号到槽函数。

Player的位置信号SIGNAL(positionChanged(qint64) 获取当前播放位置

Player的进度信号SIGNAL(durationChanged(qint64) 获取总进度

分别连接各自自定义槽函数,信号是播放器自动触发。

音乐播放器的换肤功能:

准备好预先写好的qss文件进行只读操作:

 

如何写qss文件:

比如QPushButton { color: red }。

QPushButton指定了是对所有的QPushButton或是其子类控件产生影响,而color:red表明所有的受影响控件的前景色都为red。若想单独修改一个控件的样式这需要该控件调用setObjectname,假设定义了一个

QPushButton new;并不是使用new这个对象名,而是通过new->setObjectname (“wc”),QPushButton#wc { color: red }。这样qss就能识别出修改哪个对象。每种控件格式都大致这样,但每个控件都有各自的子控件对象,在对子对象进行样式修改也是类似格式。

本地音乐的保存:

需要使用到QSqlDatabase,使用它需要在工程文件里添加QT += sql;

QSqlDatabase和我们之前学的mysql非常相似。

首先使用它就需要创建它。

通过QSqlDatabase::addDatabase  创建数据库

setDatabaseName("Music.db");设置数据库名字。

在mysql中创好数据库后就是往库里面插入数据表格,

通过定义QSqlQuery query(Database)打开对应数据库,使用query.exec()函数进行表格操作。exec()里面的操作和我们之前学的mysql一模一样。比如

query.exec("CREATE TABLE musicList(id INTEGER primary key AUTOINCREMENT, musicPath varchar, musicName verchar)");

创建一个名叫musicList的表格,id设为主键,musicPath,musicName都为表头,且该列下数据类型为verchar型。有了mysql的基础数据库操作起来是非常上手的。

 

sql数据的添加音乐和读取音乐操作基本类似:

QSqlDatabase database = QSqlDatabase::database("Music_Database");

QSqlQuery query(database);按照之前打开对应的数据库,通过query.exec()对表格进行操作

query.exec(QString("SELECT *FROM musicList WHERE musicName = '%1'").arg(info.baseName()));

首先要查找表格里是否有同名音乐,否则不在重复添加。

通过QFileInfo去路径中获得歌名和歌曲路径。

QString musicPath = info.absoluteFilePath();

QString musicName = info.baseName();

query.exec(QString( “INSERT INTO musicList WHERE musicName = '%1'").arg(info.musicName()));

query.exec(QString( “INSERT INTO musicList WHERE musicName = '%1'").arg(info.musicPath()));

这就成功在添加本地音乐的同时把音乐的路径和歌名添加到了数据库。

下一次打开音乐播放器时,自动读取数据库中歌曲路径添加到PlayList中去,就不用麻烦自己每次打开都要自己添加歌曲。

关于在线音乐播放:

打开某音乐官网,在搜索栏中输入凤凰传奇等歌曲名字(用于获取数据),并按F12进入开发者工具,并选择Network(Network会显示网页和服务器之间的数据交流)。找到对应的api接口。通过浏览器搜索该接口,返回的会是密密麻麻的json,这时就要将返回的json进行解析,从而获取歌曲信息。

 该图源于网络。

在json里不难看到歌曲的各种信息,通过解析获取歌曲的id,歌手名,音乐名等。将获取的信息填入到api接口中,获取请求。

 

url=QString("https://music.163.com/song/media/outer/url?id=%1").arg(musicId);

PlayList->addMedia(QUrl(url));

获取的歌曲id是每首歌特有的,通过id可以精准找到需要播放的歌曲,再添加到Playlist中进行播放。

这是我的音乐播放器ui界面:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Qt的在线音乐播放器 的相关文章

  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • python中rfind函数作用_python中的rfind函数如何使用

    python中rfind函数的用法 rfind 函数用于返回字符串最后一次出现的位置 从右向左查询 如果没有匹配项则返回 1 具体使用方法如 print str rfind substr 0 10 函数描述 推荐教程 Python入门教程
  • Ubuntu系统无法联网问题

    在网上看到许多解决方案是修改网络配置文件 但是ubuntu系统的目录结构中甚至都没有对应文件 因此找到以下解决方案 能够顺利联网并进行sudo install 亲测有效解决方案 1 在虚拟机设置中将网络适配器修改为NAT模式 2 找到net
  • please check whether the configs are released in Apollo!

    项目启动一直报错 其他同事 其他模块都没有这个错误 关键信息如下 Cause status code 404 Could not find config for namespace appId m ln contractmanage clu
  • Java程序员必须要了解的七个开源协议介绍

    1 Mozilla Public License MPL License 允许免费重发布 免费修改 但要求修改后的代码版权归软件的发起者 这种授权维护了商业软件的利益 它要求基于这种软件得修改无偿贡献版权给该软件 这样 围绕该软件得所有代码
  • 【C++】模板定义位置引发未定义标识符 “E“

    代码如下 include
  • 为什么怕写代码(自己的亲身经历)

    下班了 坐在工位不知不觉就又想起了刚开始接触java编程的日子 其实我觉得这个毛病也不在少数人 因为在我上学的时候班里面分组做项目 基本都是什么情况呢 一人做好 全部就可以交任务了 最后导致了如果代码某个地方出错了 全班90 的都出错了 归
  • pytorch下载与安装(离线包版本)

    笔者因为实验需要 不同的模型需要不同版本版本的pytorch 于是安装pytorch就总是出现一个问题 那就是断 比如需要安装torch1 4版本 使用Anaconda Prompt尝试了几次 pip install torch 1 4 0
  • python中eoferror是啥错误,python怎么看错误类型是什么

    以下是python的错误类型的总结 希望能帮助到有需要的小伙伴 Python全部的错误类型 错误类型 说明 ZeroDivisionError 除 或取模 零 所有数据类型 ValueError 传入无效的参数 AssertionError
  • 【精华】详解Qt中的内存管理机制

    前言 内存管理 是对软件中内存资源的分配与释放进行有效管理的方法和理论 众所周知 内存管理是软件开发的一个重要的内容 软件规模越大 内存管理可能出现的问题越多 如果像C语言一样手动地管理内存 一会给开发人员带来巨大的负担 二是手动管理内存的
  • 人生百味-7:一个人干活,一群人催进度,谁之过?

    如果你曾经是程序员 我相信你会深有体会 如果你曾经是项目管理 我相信你会有感受 旁观的说 那是专业活 只有他能做得来 干活的说 对不起大家 还还需要一段时间查
  • 论文阅读-Attention Bottlenecks for Multimodal Fusion(多模态特征融合)

    一 论文信息 论文题目 Attention Bottlenecks for Multimodal Fusion paperwithcode https paperswithcode com paper attention bottlenec
  • 分组密码算法与DES算法

    目录 1 分组密码的含义 1 1 分组密码介绍 1 2 分组密码的含义 1 3 分组密码的要求 2 分组密码的设计思想 2 1 分组密码的设计思想 3 分组密码的基本特点 3 1 分组密码的基本特点 3 2 分组密码的迭代结构 3 3 子密
  • 网关ping不通

    一 ping 网关 ping 10 0 0 254 ping sendto Host is down ping sendto Host is down Request timeout for icmp seq 0 ping sendto H
  • windows批处理:路径以\结尾 + unix换行 + rem + %~dp0时会导致报错

    windows对unix和windows换行符都支持的 但是遇到一种情况对unix不支持 之前遇到过window10执行没问题 但到了win7却有问题 代码如下 set project dir name Lua515 rem dp0 aaa
  • 轻松穿戴 IMU嵌入宽松衣服里做动作捕捉

    在日常生活中 保持正确姿势能够有效促进血液循环并降低慢性疾病的患病风险 在康复环境中 姿势监测可以帮助医护人员评估病情和治疗手段的效果 从而改善患者的身体状况 在以往的研究中 往往要求IMU牢固固定在穿戴者的特定身体部位 对穿戴要求较高 操
  • codeblocks安装、使用、调试教程

    一 下载 官方下载地址 二 安装 运行codeblocks 20 03mingw setup exe或FossHUB 界面如下 点击 Next gt 点击 I Agree 如上图所示的选择组件界面 这时一定要勾选 MinGW Compile
  • Python实现某网站爬取小说(爬虫)

    该代码仅供学习交流 爬虫 爬虫是一种自动化程序 用于从互联网上获取和提取数据 它模拟人类用户的行为 在网页上浏览和抓取信息 并将所需数据保存或处理 下面演示的代码是爬取小说的 先看运行效果图 下载完成后 直接合并为一个文件 超方便好吧 不是
  • 无法访问GitHub,原因以及快速解决办法

    访问GitHub时 总是无法访问 例如出现如下情况 原因分析 一 首先 需要明确的是GitHub本身并没有封锁某些地区的访问 如果无法访问GitHub 很有可能是由于网络层面的问题 可能存在以下问题 DNS是一种用于将网址转换为IP地址的工
  • python 点击run 报错 @NotNull method

    问题 Error running test NotNull method com intellij execution configurations GeneralCommandLine getExePath must not return
  • 基于Qt的在线音乐播放器

    1 了解音乐播放器应该有哪些功能 音乐播放器的各种控制 上下曲 单曲循环 随机播放 顺序播放 歌曲列表 歌词显示 本地音乐保存 在线音乐搜索 在线音乐播放 2 制作Qt音乐播放器一定要了解QmediaPlayer和QmediaPlaylis