音乐播放器里的cpp文件

这篇博客详细介绍了如何使用cpp编程语言来创建一个音乐播放器,涵盖了文件路径处理、音频播放以及歌词同步等功能。读者需要注意将示例中的路径替换为自己的实际文件路径,以确保程序正常运行。

注意里面的路径是我自己的电脑路径,歌词歌曲等都需要具体的文件

#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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值