基于QT的网络音乐播放器(四)

news/2024/11/25 4:59:55/

关于歌词的显示,其实我的主要思想就是解析歌词部分的字符串。歌词显示分为两部分,一部分是播放器右侧的歌词显示以及下面的桌面歌词的显示。其中桌面歌词让我很难受,想了很久,后面看到一个大佬的一篇文章后才有了思路。

先看效果图:

在这里插入图片描述

其实就是解析lrc歌词字符串。lrc歌词分为两部分,前面部分是时间,后面一部分是歌词。得到时间和歌词,保存下来。我是用两个list保存的,其实后面一想,用map来保存其实更好。但是我没有改,你们可以改一下,用map来保存。
在这里插入图片描述

比如时间为00:40.11的时候歌词为:微笑在天上飞

在QMediaPlayer的positionChanged消息的相应函数里面。对比时间,现在播放的时间处于前面记录下来的时间的list中的哪两个之间,就显示相应的歌词。

桌面歌词:

桌面歌词其实就是重写paintevent函数,把文字绘制两遍,第一遍是原始颜色的歌词内容,第二遍是需要改变颜色的内容。就是使用有色的字绘制第二遍,把前面那一次绘制的一部分字遮住,就实现了这个效果。
看代码吧:

void lrc_widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.setFont(font);//先绘制底层文字,作为阴影painter.setPen(Qt::white);painter.drawText(0,0,QFontMetrics(font).boundingRect(str1).width(),this->height()/2,Qt::AlignLeft,str1);painter.drawText(0,this->height()/2,QFontMetrics(font).boundingRect(str2).width(),this->height()/2,Qt::AlignLeft,str2);//设置歌词遮罩if(isFirst){painter.setPen(QPen(linearGradient,0));if(Proportion != 0){painter.drawText(0,0,QFontMetrics(font).boundingRect(str1).width()*(lrci/double(Proportion)),this->height()/2,Qt::AlignLeft,str1);}}else{painter.setPen(QPen(linearGradient,0));if(Proportion != 0){painter.drawText(0,this->height()/2,QFontMetrics(font).boundingRect(str2).width()*(lrci/double(Proportion)),this->height()/2,Qt::AlignLeft,str2);}}
}

其中str1为第一行歌词,str2为第二行歌词

QMediaPlayer的positionChanged消息的相应函数:

void Widget::on_player_position_change(qint64 position)                         //播放歌曲进度改变,改变时间显示,歌词改变
{ui->seekSlider->setValue(position);music_position = position;int h = music_position/3600000;int m = (music_position%3600000)/60000;int s = ((music_position%3600000)%60000)/1000;int ms = ((music_position%3600000)%60000)%1000;QString timestr;QTime time(h,m,s,ms);ui->now_time_label->setText(time.toString("hh:mm:ss"));QTime time2(h,m,s,ms);timestr = time2.toString("mm:ss");for(int i = 0;i < lrcTime.count();i++){if(time <= QTime::fromString(lrcTime.at(i),"mm:ss:zzz")){// i 为下一次唱的歌词QString mm1;QString ss1;QString zzz1;QString mm2;QString ss2;QString zzz2;if(lrcindex != i || i == 0){if(i == 0){myLrc_widget->setLabel_1_text(lrcStr.at(i));myLrc_widget->setLabel_2_text(lrcStr.at(i + 1));}else{if(nowIsFirst){myLrc_widget->setLabel_2_text(lrcStr.at(i));nowIsFirst = !nowIsFirst;}else{myLrc_widget->setLabel_1_text(lrcStr.at(i));nowIsFirst = !nowIsFirst;}}if(lrcindex <= 4)              //前5行   直接下来  歌词不变{ui->Lrc_list->item(lrcindex)->setTextColor(Qt::red);for(int j = 0;j < lrcindex;j++){ui->Lrc_list->item(j)->setTextColor(Qt::black);}}else            //超过5   通过改变每行显示的歌词来改变进度{for(int j = 0;j < 4;j++){ui->Lrc_list->item(j)->setText(lrcStr.at(lrcindex - 4 + j));}for(int j = 0;j < 6;j++){if(lrcindex + j < lrcStr.count()){ui->Lrc_list->item(4+j)->setText(lrcStr.at(lrcindex + j));}else{ui->Lrc_list->item(4+j)->setText("");}}}lrcindex = i;}if(i != 0){mm1 = QString(lrcTime.at(i)).split(":").at(0);ss1 = QString(lrcTime.at(i)).split(":").at(1);zzz1 = QString(lrcTime.at(i)).split(":").at(2);mm2 = QString(lrcTime.at(i - 1)).split(":").at(0);ss2 = QString(lrcTime.at(i - 1)).split(":").at(1);zzz2 = QString(lrcTime.at(i - 1)).split(":").at(2);int y = (mm1.toInt() - mm2.toInt())*60*1000 + (ss1.toInt() - ss2.toInt())*1000 + (zzz1.toInt() - zzz2.toInt());int x = (m - mm2.toInt())*60*1000 + (s - ss2.toInt())*1000 + (ms - zzz2.toInt());myLrc_widget->setProportion(x,y);}break;}}}

这就是所有的歌词显示部分的内容,可能有些地方说得不明白,如果大家哪里有问题的可以问,或者有什么更好的建议,我看到了就回复。大家互相学习。

上一篇:调用API解析数据

项目源码下载地址:https://download.csdn.net/download/qq_37141865/10703635
github:https://github.com/helloMrDjth/QtMusic

后面重新对界面进行了优化:
在这里插入图片描述


http://www.ppmy.cn/news/171718.html

相关文章

网络控制播放器(局域网内通过TCP和UDP控制视频播放器)

分享一个视频播放器&#xff0c;这个播放器支持能过网络TCP和UDP协议控制&#xff0c;同时还支持RS232和485串口控制。 可以通过指令控制播放器播放指定的视频&#xff0c;音量控制&#xff0c;图片浏览等。 播放器支持与所有的中控软件对接。 控制指令&#xff1a; 进入视频…

基于android的网络音乐播放器-网络音乐的搜索和展示(五)

作为android初学者&#xff0c;最近把疯狂android讲义和疯狂Java讲义看了一遍&#xff0c;看到书中介绍的知识点非常多&#xff0c;很难全部记住&#xff0c;为了更好的掌握基础知识点&#xff0c;我将开发一个网络音乐播放器-EasyMusic来巩固下&#xff0c;也当作是练练手。感…

易语言在线播放器源码php,易语言视频播放器源代码

用简单的语言编写视频播放器的源代码 源代码包含以下功能: *调用Thunder APlayer SDK进行视频播放*自动检测是否下载Thunderbolt解码库,如果不存在,则自动下载并解压缩(新手可以学习)新手可以学习)*支持快捷键可快进和快退以及将音量最多增加或减小至1000 *自动截取本地视频缩…

基于QT的网络音乐播放器(一)

自学Qt已经有一段时间了&#xff0c;但是始终感觉自己还是很弱&#xff08;其实并不是感觉自己很弱&#xff0c;是自己本来就很弱&#xff0c;哈哈&#xff09;。自己也照着书上敲了几个例子&#xff0c;但觉得还是要写点东西才能真正运用起来。所以&#xff0c;前段时间就写了…

android带投屏播放器,手机投屏播放器软件下载-投屏播放器 安卓版v2.4.6-PC6安卓网...

手机投屏播放器软件是一款非常不错的投屏神器&#xff0c;使用投屏播放器app用户可以将手机上的视频投放在光滑的墙面上&#xff0c;投屏播放器app也能投放到Tv上&#xff0c;设置方法非常简单&#xff0c;喜欢的玩家不要错过&#xff0c;欢迎下载&#xff01; 软件介绍 手机投…

dlna android播放器,dlna音乐播放器app

dlna音乐播放器app是一款基于DLNA协议,能把手机音乐在音响,电脑,电视机等设备上进行播放的应用软件,这款工具适用于当前市面上所有的安卓手机,只需要按照操作步骤就能完美使用了,让科技改善生活,个性引领潮流。 应用简介: 基于DLNA协议,通过app把手机的音频与网络音频…

Qt实现网络播放器

经常有人询问一些关于网络传输、制作在线试听及下载 音乐、构造及解析数据等的一些问题&#xff0c;今天就在这里一并讲解。 网络操作&#xff1a; 主要涉及&#xff1a;QNetworkAccessManager、QNetworkRequest、QNetworkReply这三个类。 参考&#xff1a; Qt实现网络数据传输…

Android实战练习——简单的网络视频播放器

项目目录 一、项目概述二、开发环境三、项目结构四、运行演示五、项目总结六、源码获取 一、项目概述 本次项目实现了一个简单的网络视频播放器&#xff0c;调用的是高度自定义的视频框架jiaozivideoplayer。通过gson解析网络视频的api&#xff0c;获取每个视频的url、点赞量和…