注意里面的路径是我自己的电脑路径,歌词歌曲等都需要具体的文件
#include "musicplayer.h"
#include "ui_musicplayer.h"
#include <QDebug>
#include <QTime>
#include <QFileInfoList>
#include <QDir>
MusicPlayer::MusicPlayer(QWidget *parent) :
QWidget(parent),
ui(new Ui::MusicPlayer)
{
ui->setupUi(this);
initPlaylist();
initPlayer();
initWidgetUnits();
}
MusicPlayer::~MusicPlayer()
{
delete ui;
}
void MusicPlayer::initPlaylist(void)
{
m_playList = new QMediaPlaylist;
connect(m_playList,SIGNAL(currentIndexChanged(int)),
this,SLOT(slotCurrentIndexChanged(int)));
m_playMode = 3 ;
m_playList->setPlaybackMode(QMediaPlaylist::Loop);
QDir songsDir("E:/QT/0201/歌曲歌词未加密/安装文件/UnigressMusic/songs");
QFileInfoList infos =
songsDir.entryInfoList(QStringList() << "*.mp3" ,
QDir::Files,QDir::Name);
foreach(const QFileInfo &info,infos)
{
m_songNameList.append(info.baseName());
m_playList->addMedia(QUrl::fromLocalFile(info.canonicalFilePath()));
}
}
void MusicPlayer::slotCurrentIndexChanged(int position)
{
m_songName = m_songNameList.at(position);
ui->lb_songName->setText(m_songName);
ui->lw_songNameList->setCurrentRow(position);
QString lyricFileName = "E:/QT/0201/歌曲歌词未加密/安装文件/UnigressMusic/lyrics/" + m_songName + ".lrc" ;
m_mapTimeAndIndex.clear();
lyricContent.clear();
ui->lw_lyricShow->clear();
QFile lyricFile(lyricFileName) ;
if(lyricFile.open((QIODevice::ReadOnly)))
{
QTextStream in(&lyricFile) ;
int index = 0;
while(!in.atEnd())
{
QStringList timeAndLyric = in.readLine().split("]");
QString timeStr = timeAndLyric[0].remove("[");
QStringList minuteAndSecond = timeStr.split(":");
qint64 t = minuteAndSecond.at(0).toInt()*60
+ minuteAndSecond.at(1).toDouble();
if(!timeAndLyric.at(1).isEmpty())
{
m_mapTimeAndIndex.insert(t, index++) ;
lyricContent.append(timeAndLyric.at(1)) ;
}
}
ui->lw_lyricShow->addItems(lyricContent);
for(int i = 0; i< ui->lw_lyricShow->count();i++)
{
ui->lw_lyricShow->item(i)->setTextAlignment(Qt::AlignCenter);
}
}
}
void MusicPlayer::initPlayer(void)
{
m_player = new QMediaPlayer;
connect(m_player, SIGNAL(positionChanged(qint64)),
this, SLOT(slotPositionChanged(qint64)));
connect(m_player,SIGNAL(durationChanged(qint64)),
this,SLOT(slotDurationChanged(qint64)));
m_player->setPlaylist(m_playList);
m_playList->setCurrentIndex(17);
m_playList->setPlaybackMode(QMediaPlaylist::Loop);
// m_player->setMedia(QUrl::fromLocalFile("E:/QT/0201/歌曲歌词未加密/安装文件/UnigressMusic/songs/薛之谦-你还要我怎样.mp3"));
m_player->setVolume(InitVoluneValue);
m_player->play(); //默认状态是播放状态
}
void MusicPlayer::slotDurationChanged(qint64 duration)
{
m_currentPosition = 0 ;
m_currentDuration = duration/MSToS ;
QTime positionT(m_currentPosition/3600,m_currentPosition%3600/60,
m_currentPosition%60);
QTime durationT(m_currentDuration/3600,m_currentDuration%3600/60,
m_currentDuration%60);
ui->lb_position->setText(positionT.toString("mm:ss")
+"/"+durationT.toString("mm:ss"));
ui->hs_position->setMaximum(m_currentDuration);
}
void MusicPlayer::slotPositionChanged(qint64 position)
{
m_currentPosition = position/MSToS ;
QTime positionT(m_currentPosition/3600,m_currentPosition%3600/60,
m_currentPosition%60);
QTime durationT(m_currentDuration/3600,m_currentDuration%3600/60,
m_currentDuration%60);
ui->lb_position->setText(positionT.toString("mm:ss")
+"/"+durationT.toString("mm:ss"));
// ui->hs_position->setValue(m_currentPosition);
if(m_mapTimeAndIndex.contains(m_currentPosition))
{
ui->lw_lyricShow->setCurrentRow(
m_mapTimeAndIndex.value(m_currentPosition));
}
if(!ui->hs_position->isSliderDown()) //当slider不被按下时
{
ui->hs_position->setValue(m_currentPosition);
}
}
void MusicPlayer::initWidgetUnits(void)
{
//去除Widget界面边框
this->setWindowFlags(Qt::FramelessWindowHint);
ui->hs_volume->setValue(InitVoluneValue);
ui->pb_playMode->setStyleSheet("border-image:url(:/images/skins/images/loopPressed.png)");
ui->lw_songNameList->addItems(m_songNameList);
//隐藏水平方向和垂直方向的滚动条
ui->lw_songNameList->setVerticalScrollBarPolicy(
Qt::ScrollBarAlwaysOff);
ui->lw_songNameList->setHorizontalScrollBarPolicy(
Qt::ScrollBarAlwaysOff);
ui->lw_lyricShow->setVerticalScrollBarPolicy(
Qt::ScrollBarAlwaysOff);
ui->lw_lyricShow->setHorizontalScrollBarPolicy(
Qt::ScrollBarAlwaysOff);
}
void MusicPlayer::on_pb_min_clicked()
{
this->showMinimized();
}
void MusicPlayer::on_pb_max_clicked()
{
if(this->isMaximized())
{
this->showNormal();
}else{
this->showMaximized();
}
}
void MusicPlayer::on_pb_close_clicked()
{
this->close();
}
///用于界面移动的相关鼠标事件
void MusicPlayer::mousePressEvent(QMouseEvent *ev)
{
if(ev->buttons() == Qt::LeftButton)
{
m_widgetMove = ev->globalPos() -
this->frameGeometry().topLeft();
ev->accept(); //鼠标事件被系统接收
}
}
void MusicPlayer::mouseMoveEvent(QMouseEvent *ev)
{
this->move(ev->globalPos() - m_widgetMove);
ev->accept();
}
void MusicPlayer::on_pb_play_clicked()
{
if(m_player->state() == QMediaPlayer::PlayingState)
{
m_player->pause();
ui->pb_play->setStyleSheet("border-image: url(:/images/skins/images/playStartPressed.png)");
}else
{
m_player->play();
ui->pb_play->setStyleSheet("border-image: url(:/images/skins/images/pausePressed.png)");
}
}
void MusicPlayer::on_hs_position_sliderMoved(int position)
{
m_player->setPosition(position *MSToS);
}
void MusicPlayer::on_hs_volume_sliderMoved(int position)
{
m_player->setVolume(position);
}
void MusicPlayer::on_lw_songNameList_doubleClicked(const QModelIndex &index)
{
m_playList->setCurrentIndex(index.row());
}
void MusicPlayer::on_pb_playMode_clicked()
{
m_playMode ++ ;
m_playMode %= 5 ;
switch (m_playMode) {
case QMediaPlaylist::CurrentItemOnce:
ui->pb_playMode->setStyleSheet("border-image: url(:/images/skins/images/currentItemOncePressed.png)") ;
m_playList->setPlaybackMode(QMediaPlaylist::CurrentItemOnce);
break;
case QMediaPlaylist::CurrentItemInLoop:
ui->pb_playMode->setStyleSheet("border-image: url(:/images/skins/images/currentItemInLoopPressed.png)");
m_playList->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
break;
case QMediaPlaylist::Sequential:
ui->pb_playMode->setStyleSheet("border-image: url(:/images/skins/images/sequentialPressed.png)");
m_playList->setPlaybackMode(QMediaPlaylist::Sequential);
break;
case QMediaPlaylist::Loop:
ui->pb_playMode->setStyleSheet("border-image:url(:/images/skins/images/loopPressed.png)");
break;
case QMediaPlaylist::Random:
ui->pb_playMode->setStyleSheet("border-image:url(:/images/skins/images/randomPressed.png)");
m_playList->setPlaybackMode(QMediaPlaylist::Random);
break;
default:
break;
}
}
void MusicPlayer::on_pb_prev_clicked()
{
// m_playList->setCurrentIndex(m_playList->previousIndex());
m_playIndex = m_playList->previousIndex();
if(m_playIndex == -1)
{
m_player->stop();
ui->pb_play->setText(tr("Play"));
}else{
m_playList->setCurrentIndex(m_playIndex);
}
}
void MusicPlayer::on_pb_next_clicked()
{
// m_playList->setCurrentIndex(m_playList->nextIndex());
m_playIndex = m_playList->nextIndex();
if(m_playIndex == -1)
{
m_player->stop();
ui->pb_play->setText("Play");
}else{
m_playList->setCurrentIndex(m_playIndex);
}
}
这篇博客详细介绍了如何使用cpp编程语言来创建一个音乐播放器,涵盖了文件路径处理、音频播放以及歌词同步等功能。读者需要注意将示例中的路径替换为自己的实际文件路径,以确保程序正常运行。
3734

被折叠的 条评论
为什么被折叠?



