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

QQMusic项目功能总结

QQMusic项目功能总结

一、核心功能分类

(一)界面交互功能

功能模块实现方式使用类(自定义/Qt库)核心类说明
窗口布局Head区(图标、搜索框、控制按钮)+ Body区(左侧功能栏+右侧页面区),QStackedWidget管理6个页面Qt库(QWidget、QStackedWidget、QHBoxLayout等)
按钮交互左侧BtForm按钮带图标、文本和动画效果,点击切换页面,悬停/点击颜色变化自定义类(BtForm)继承QWidget
属性:id(页面索引)
函数:setIcon(设置图标/文本/ID)、clearBg(清除样式)、showAnimal(显示动画)
功能:通过QPropertyAnimation实现右侧竖条动画,点击时发射信号切换QStackedWidget页面
推荐页轮播左右翻页按钮切换推荐内容,鼠标悬停元素上移动画自定义类(RecBox、RecBoxItem)RecBox继承QWidget,管理RecBoxItem列表;RecBoxItem继承QWidget,处理鼠标事件
函数:initRecBoxUi(初始化布局)、createRecBoxItem(创建推荐项)
流程:解析QJsonArray数据,动态生成RecBoxItem,通过QPropertyAnimation实现悬停位移动画
歌词显示点击“词”按钮弹出歌词页,带动画显示/隐藏,歌词随时间滚动自定义类(LrcPage)继承QWidget
函数:parseLrc(解析LRC文件)、showLrcWord(同步歌词)
流程:解析LRC文件生成时间-歌词映射,通过QPropertyAnimation实现页面上下滑动动画,根据播放时间更新当前歌词高亮

(二)音乐播放功能

功能模块实现方式使用类(自定义/Qt库)核心类说明
基础播放控制播放/暂停、上一曲/下一曲、音量调节、Seek进度条Qt库(QMediaPlayer、QMediaPlaylist)QMediaPlayer处理播放逻辑,QMediaPlaylist管理播放列表
函数:setPlaylist(设置播放列表)、setVolume(调节音量)、setPosition(Seek定位)
信号槽:关联stateChanged(更新播放按钮图标)、positionChanged(同步进度和时间)
播放模式随机、单曲循环、列表循环Qt库(QMediaPlaylist)枚举PlaybackMode设置模式,通过信号playbackModeChanged更新界面图标
歌词同步解析LRC文件,按时间戳显示当前歌词自定义类(LrcPage)+ Qt库解析LRC文件生成LyricLine结构体(时间+歌词),通过QMediaPlayer的positionChanged信号触发歌词更新

(三)数据管理与持久化

功能模块实现方式使用类(自定义/Qt库)核心类说明
歌曲信息管理Music类封装元数据(名称、歌手、专辑、路径、收藏/历史标记)自定义类(Music)继承QObject
属性:musicId(UUID唯一标识)、isLike、isHistory
函数:parseMediaMetaData(解析元数据)、insertMusicToDB(写入数据库)
流程:通过QMediaPlayer解析音频文件元数据,存储到Music对象,通过MusicList管理列表
数据库持久化SQLite存储歌曲信息、收藏和播放记录Qt库(QSqlDatabase、QSqlQuery)创建musicInfo表,程序启动时读取数据库恢复数据,退出时写入最新状态
SQL语句:CREATE TABLE(建表)、INSERT/UPDATE(写入)、SELECT(查询)

(四)自定义控件汇总

控件名称继承类核心属性关键函数功能描述
BtFormQWidgetid(页面索引)setIcon()、clearBg()、showAnimal()左侧功能按钮,带图标、文本和动画效果,点击切换页面,通过信号槽与QStackedWidget联动
RecBoxQWidgetrow(行数)、col(列数)initRecBoxUi()、createRecBoxItem()推荐页轮播容器,管理RecBoxItem,支持左右翻页和分组显示
CommonPageQWidgetpageType(页面类型:收藏/本地/历史)setCommonPageUI()、reFresh()通用页面模板,统一管理“我喜欢”“本地下载”“最近播放”页面,通过QListWidget显示歌曲列表
ListItemBoxQWidgetisLike(收藏状态)setMusicName()、setLikeIcon()列表项控件,显示歌曲详情和收藏图标,点击收藏按钮发射信号更新Music对象
MusicSliderQWidgetcurrentPos(当前进度)mousePressEvent()、mouseMoveEvent()自定义进度条,支持鼠标拖拽Seek,通过信号同步播放位置
VolumeToolQWidgetisMuted(静音状态)、volumeRatio(音量比例)eventFilter()、setVolume()音量调节弹窗,带静音按钮和滑动条,通过事件过滤器处理鼠标操作,发射信号更新音量

(五)技术实现流程

  1. 页面切换流程
    • 点击左侧BtForm按钮,触发click信号并传递页面ID
    • QQMusic接收信号后,遍历所有BtForm按钮,清除非当前按钮的样式和动画
    • 通过QStackedWidget.setCurrentIndex()显示对应页面,调用updateBtFormAnimal()更新当前按钮动画
  2. 音乐播放流程
    • 双击列表项或点击“播放全部”,触发CommonPage发射playAll或playMusicByIndex信号
    • QQMusic根据信号获取当前页面歌曲列表,清空QMediaPlaylist并重新添加歌曲URL
    • 调用QMediaPlayer.play()开始播放,关联stateChanged信号更新播放按钮图标,positionChanged同步进度和时间
  3. 数据持久化流程
    • 写入数据库:程序退出时,MusicList遍历所有Music对象,检测是否存在,存在则更新isLike和isHistory,不存在则插入新记录
    • 读取数据库:程序启动时,从musicInfo表查询所有记录,生成Music对象并添加到MusicList,更新各CommonPage显示
  4. 歌词同步流程
    • 播放歌曲时,QMediaPlayer触发metaDataAvailableChanged信号,获取当前歌曲LRC路径
    • LrcPage.parseLrc()解析LRC文件,生成时间-歌词列表
    • 监听QMediaPlayer.positionChanged信号,计算当前时间对应的歌词行,更新界面显示并高亮当前歌词

(六)未实现与扩展功能

功能状态后续计划
皮肤更换暂未实现通过QSS动态切换样式表,支持自定义背景颜色或图片
网络模块暂未实现添加网络请求接口,实现在线歌曲搜索、推荐和歌词下载
单实例运行已实现通过QSharedMemory检测共享内存,防止程序多开
http://www.xdnf.cn/news/2168.html

相关文章:

  • openEuler对比CentOS的核心优势分析
  • Web端ER可视化
  • 部署大模型需要多少GPU显存?以DeepSeek R1部署为例
  • MongoDB Atlas与MongoDB连接MCP服务器的区别解析
  • SpringBoot物资管理系统 | JavaWeb项目设计与实现
  • 山东大学离散数学第九章习题解析
  • 雪花算法
  • 深入解析NuttX:为何它是嵌入式RTOS领域的标杆?​​
  • 多模态大语言模型arxiv论文略读(四十三)
  • 力扣2444. 统计定界子数组的数目:Java三种解法详解
  • 5G助力智慧城市的崛起——从概念到落地的技术实践
  • 哈希表的模拟实现---C++
  • Ubuntu下安装vsode+qt搭建开发框架(一)
  • 推荐几个免费提取音视频文案的工具(SRT格式、通义千问、飞书妙记、VideoCaptioner、AsrTools)
  • 直线模组精度测试的标准是什么?
  • Linux 进程控制
  • 树状数组底层逻辑探讨 / 模版代码-P3374-P3368
  • 阿里云VS AWS中国区:ICP备案全攻略与常见误区解析
  • 判断 ONNX 模型是否支持 GPU
  • 微信小程序 - 根据经纬度打开导航
  • 追风赶月莫停留
  • WebcamJS中文文档
  • Debian安装避坑
  • 动态规划求解leetcode300.最长递增子序列(LIS)详解
  • React 与 Vue 的区别:你会选择哪个框架呢
  • 关于Android Studio的Gradle各项配置
  • 高级 SQL 技巧:提升数据处理能力的实用方法
  • 图像畸变-径向切向畸变实时图像RTSP推流
  • leetcode 26和80
  • strcmp()在C语言中怎么用(附带实例)