python3GUI--QQ音乐By:PyQt5(附下载地址)


一.前言

本次模仿QQ音乐制作了一款PyQt5的QQ音乐,支持音乐、视频播放、软件安装包放在了文末,大家可以自行下载,欢迎大家给我提BUG。

二.展示

0.播放页

播放页的序号为什么是0呢?因为我先把后面写完,忘了。
桌面歌词支持渲染,左侧黑胶会根据播放状态和音效状态展示不同的效果
请添加图片描述

背景颜色是根据当前歌曲cover计算出来的
在这里插入图片描述
在这里插入图片描述
当歌曲暂停播放时,黑胶转盘也就停止旋转了
在这里插入图片描述

在这里插入图片描述

1.主界面

1.精选

使用PyQt5制作
在这里插入图片描述
中间歌曲、视频推荐
在这里插入图片描述

2.有声电台

会推荐一些电台频道
在这里插入图片描述

3.排行

无需多说,此页面为歌曲的排行合集页面
在这里插入图片描述
下方有两个榜单 点开是歌单合集
在这里插入图片描述

4.歌手

歌手页面支持筛选哦
在这里插入图片描述

5.歌单

这里会随机推荐一些歌单
在这里插入图片描述

”官方歌单“为一个支持无限下拉的模块,将滚动条滚动到最下方即可加载新数据
在这里插入图片描述
加载新数据
在这里插入图片描述

2.推荐

推荐页面会根据用户播放记录推荐可能会喜欢的歌曲,并且推荐两个合集。
在这里插入图片描述
下方推荐一些歌单以及电台节目
在这里插入图片描述

3.视频

1.视频

此页面推荐一些视频以及新歌MV
在这里插入图片描述

新歌MV
在这里插入图片描述

2.分类

分类页面支持视频筛选,目前支持三个筛选项

在这里插入图片描述

3.视频分类

视频分类是一个支持无限下拉的视频推荐页面
在这里插入图片描述

4.雷达

雷达页面和推荐页面类似
在这里插入图片描述

5.我喜欢

因为部分页面功能类似,这里只展示两个页面

1.歌曲

在这里插入图片描述

2.歌手

展示在歌手页面关注的歌手
在这里插入图片描述

6.本地&下载

展示本地和已下载的歌曲和MV视频
在这里插入图片描述

7.最近播放

展示播放过的MV和音乐
在这里插入图片描述

8.歌单

歌单页面支持分享,点击右上角能够自动生成二维码

1.一般歌单

在这里插入图片描述

2.自建歌单

(其实就是一般歌单啦)

在这里插入图片描述

3.排行榜

在这里插入图片描述

9.其他

1.搜索词推荐

在这里插入图片描述

2.搜索结果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三.软件设计

软件整体框架布局使用QT Designer设计,所有组件均为自写代码,主界面分为:导航区、顶部搜索功能区、中间内容区、下方播放控制区。整体采用垂直布局,局部水平布局。
stackWidget page1:
在这里插入图片描述
通过“提升组件”的方式将我们自定义的组件填充到目标内容区域。
在这里插入图片描述

下图为播放页面布局 此页面由顶部功能区、中间左侧可视化黑胶组件、中间右侧歌词内容区、中间下方可视化占位区、以及下方播放控制区组成。
stackWidget page2
在这里插入图片描述
在这里插入图片描述

四.所有功能-览

软件功能和结构详见下图

请添加图片描述

五.技术实现

1.内存共享

通过使用内存共享技术限制程序仅允许启动一次。本次是使用QSharedMemory实现的。

QSharedMemory是PyQt5中的一个类,用于在不同的进程之间共享内存。它可以让多个进程访问同一块内存区域,从而实现进程间的数据共享。
使用QSharedMemory,我们可以在一个进程中创建一个共享内存区域,并将其映射到其他进程中。这样,其他进程就可以通过访问这个共享内存区域来读取或写入数据。
QSharedMemory提供了一些方法来管理共享内存区域,包括创建、打开、关闭、读取和写入等。它还提供了一些信号,用于通知其他进程共享内存区域的状态变化。
需要注意的是,由于共享内存区域是在不同的进程之间共享的,因此需要特别小心地处理数据的同步和互斥问题,以避免数据的不一致性和竞争条件。

2.线程处理数据

通过继承QThread实现相关线程的操作,所有的网络耗时网络IO操作都是在子线程中实现的,耗时操作完成后,使用信号和槽机制,完成相关数据的处理,最终将数据展示到UI线程(主线程)中。

QThread是PyQt5中的一个类,用于创建多线程应用程序。它可以让我们在一个单独的线程中执行耗时的操作,从而避免阻塞主线程,提高应用程序的响应性能。
使用QThread,我们可以创建一个新的线程,并将耗时的操作放在这个线程中执行。在主线程中,我们可以通过信号和槽机制来与这个线程进行通信,从而实现线程间的数据交换和同步。
QThread提供了一些方法来管理线程的生命周期,包括启动、停止、暂停和恢复等。它还提供了一些信号,用于通知主线程线程的状态变化。
需要注意的是,由于多线程应用程序存在数据同步和互斥问题,因此需要特别小心地处理线程间的数据交换和同步,以避免数据的不一致性和竞争条件。

3.打包

本次并不是使用pyinstaller打包,而是使用nuitka对py软件进行打包,使用Nuitka编译Python程序可以将Python代码转换为C++代码,从而提高程序的执行速度和性能。此外,由于生成的可执行文件不需要安装Python解释器,因此可以方便地在其他计算机上运行程序。打包后使用inno Setup工具将打包好的软件再打包成安装包,方便移植。

4.本地化数据

最近播放与收藏采用数据存储到本地SQLite数据库的方式持久化数据,本软件封装了两个数据表存最近播放与收藏数据,同表不同类别数据使用类型做区分。

使用SQLite有以下好处:
1.轻量级:SQLite是一种轻量级的数据库,它不需要独立的服务器进程或配置,可以直接在应用程序中使用。2.易于使用:SQLite3 Python提供了一个简单的API,使得开发人员可以轻松地连接、查询和操作SQLite数据库。
3.跨平台:SQLite3 Python可以在多个平台上运行,包括Windows、Linux和Mac OS X等。
4.安全性:SQLite3 Python提供了一些安全特性,如数据加密和访问控制,可以保护数据库中的敏感信息。
5.可嵌入性:SQLite3 Python可以嵌入到其他应用程序中,使得应用程序可以使用SQLite数据库来存储和管理数据。
6.高性能:SQLite3 Python具有高性能和高可靠性,可以处理大量数据和高并发访问。
7.开源:SQLite3 Python是一个开源项目,可以免费使用和修改。

5.播放列表

本次重写了QMediaPlaylist,目的是为了避免每次更新播放列表都去获取所有列表内的音频资源,重写后只有用到歌曲资源的时候才去获取资源,配合播放列表以及内置算法,减少了许多的网络IO与磁盘读写消耗。使用“链表”作为播放列表的数据结构,设置索引标识当前歌曲,能够方便地通过其他组件获取播放内容。

在这里插入图片描述

6.动态右击菜单

使用Qmenu创建右击菜单 采用QAction创建项,根据所选内容展示右击菜单内容,这里以右击搜索功能为例:当用户在搜索结果页TableWidget右击鼠标时,绑定到组件右击信号上的槽函数被触发,通过获取所选位置内容,构建右击菜单选项。

在这里插入图片描述

六.总结

好多人说我水博客,我其实是想让大多数不方便下载软件的朋友看到我做出来的软件效果,具体体验当然要去下载一个才能体会到。本次开发时间都是挤出来的,项目从国庆前就着手了,只是为了模仿一下,本软件也只供交流和学习使用,请勿他用!如果觉得本篇还不错的话,给我点个赞呗~软件在这里下载
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/a1397852386/article/details/134349973