QT实现简单音乐播放器

2020-06-30 19:00:37丽君

mainwindow.cpp代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QFile>
#include <QTextStream>
#include <QTextCodec>

MainWindow::MainWindow(QWidget *parent)
  : QMainWindow(parent)
  , ui(new Ui::MainWindow)
{
  ui->setupUi(this);
  connect(ui->Buttonstart,&QPushButton::clicked,this,&MainWindow::slotButtonStart);
  connect(ui->Buttonlast,&QPushButton::clicked,this,&MainWindow::slotButtonLast);
  connect(ui->Buttonnext,&QPushButton::clicked,this,&MainWindow::slotButtonNext);
  connect(ui->Buttonstart,&QPushButton::clicked,this,&MainWindow::changestartbutton);
  connect(ui->Buttonvideo_wm,&QPushButton::clicked,this,&MainWindow::video_click_wm);
  connect(ui->Buttonvideo_qr,&QPushButton::clicked,this,&MainWindow::video_click_qr);
  connect(ui->Buttonvideo_cq,&QPushButton::clicked,this,&MainWindow::video_click_cq);
  connect(ui->Buttonmute,&QPushButton::clicked,this,&MainWindow::mute);
  connect(ui->fastButton,&QPushButton::clicked,this,&MainWindow::fastForward);
  connect(ui->fastbackButton,&QPushButton::clicked,this,&MainWindow::fastBack);
  init();
}

MainWindow::~MainWindow()
{
  delete ui;
}

void MainWindow::init(){
  button_style();

  PlayerList = new QMediaPlaylist;  //实例化播放器和播放列表
  Player = new QMediaPlayer;
  fileList = getFileNames(this->MusicPath);  //获取文件夹下所有音乐文件
  lrcList = getLrcNames(this->LrcPath);
  moved = 0;
  qDebug()<<"ALL Music File n"<<fileList;
  qDebug()<<"ALL Lrc File n"<<lrcList;


  for(int i=0;i<fileList.size();i++){
    QString fileName=fileList.at(i);
    addItem(fileName);
    PlayerList->addMedia(QUrl::fromLocalFile(MusicPath+""+fileName));
  }
  PlayerList->setCurrentIndex(0);
  Player->setPlaylist(PlayerList);  //将播放列表加载到播放器

  connect(Player,&QMediaPlayer::currentMediaChanged,this,&MainWindow::slotShowCurrentMusic);
  connect(Player,&QMediaPlayer::currentMediaChanged,this,&MainWindow::slotShowCurrentLrc);
  connect(Player,&QMediaPlayer::currentMediaChanged,this,&MainWindow::cleanmap);
  connect(ui->Buttonstart,&QPushButton::clicked,this,&MainWindow::slotShowCurrentLrc);
  connect(ui->Buttonnext,&QPushButton::clicked,this,&MainWindow::slotShowCurrentLrc);
  connect(ui->Buttonlast,&QPushButton::clicked,this,&MainWindow::slotShowCurrentLrc);
  connect(ui->Buttonstart,&QPushButton::clicked,this,&MainWindow::slotShowCurrentMusic);
  connect(ui->Volumebar, SIGNAL(sliderMoved(int)), this, SLOT(volumChange(int)));

  connect(Player,SIGNAL(positionChanged(qint64)),this,SLOT(positionChange(qint64)));
  connect(Player,SIGNAL(durationChanged(qint64)),this,SLOT(musicTime()));
  connect(ui->Progressbar,SIGNAL(sliderMoved(int)),this,SLOT(seekChange(int)));

  connect(ui->musicname,SIGNAL(cellDoubleClicked(int,int)),this,SLOT(playto(int,int)));
}


QStringList MainWindow::getFileNames(const QString &path)
{
  QDir dir(path);
  QStringList nameFilters;
  nameFilters << "*.mp3";
  QStringList files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name);
  return files;
}

QStringList MainWindow::getLrcNames(const QString &path)
{
  QDir dir(path);
  QStringList nameFilters;
  nameFilters <<"*.txt";
  QStringList files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name);
  return files;
}

void MainWindow::addItem(QString name){
  int count = ui ->musicname->rowCount();
  ui->musicname->setRowCount(count+1);
  QTableWidgetItem *itemName = new QTableWidgetItem(name);
  itemName->setFlags(itemName->flags() & ~Qt::ItemIsEditable);
  ui->musicname->setItem(count,0,itemName);
}

void MainWindow::slotShowCurrentMusic(){
  int index=PlayerList->currentIndex();
  QString songName=fileList.at(index);
  ui->CurrentMusic->setText(songName);
}

void MainWindow::slotShowCurrentLrc(){
  int index=PlayerList->currentIndex();
  qDebug()<<index;
  QString musicLrc=lrcList.at(index);
  qDebug()<<musicLrc;
  initlrc(musicLrc);

}

void MainWindow::slotButtonStart(){
  if(!isPlay){
    isPlay=true;
    Player->setVolume(100);
    Player->play();
    musicTime();

  }
  else{
    isPlay=false;
    Player->pause();
    musicTime();
  }
}

void MainWindow::slotButtonLast(){
  int currentIndex = PlayerList->currentIndex();
  if(currentIndex == 0){
    currentIndex=PlayerList->mediaCount();
  }
  else{
  PlayerList->previous();
  PlayerList->previousIndex();
  musicTime();
  }
}

void MainWindow::slotButtonNext(){
  int currentIndex = PlayerList->currentIndex();
  if(++currentIndex == PlayerList->mediaCount()){
  currentIndex=0;}
  PlayerList->setCurrentIndex(currentIndex);
  musicTime();
}

void MainWindow::volumChange(int vol)
{
  Player -> setVolume(vol);
}

void MainWindow::positionChange(qint64 position)
{
  ui->Progressbar->setMaximum(Player->duration() / 1000);//设置滑块的长度范围为音乐长.00度
  ui->Progressbar->setValue(position / 1000);//如果音乐进度改变,则改变滑块显示位置
  moved = position;//让播放时间等于音乐进度(毫秒)
  QTime moveTime(0,(moved/60000) % 60,(moved / 1000) % 60);//设置时间
  ui->showPro ->setText(moveTime.toString("mm:ss"));//显示时间
  QString t=moveTime.toString("mm:ss");
  QString mm = t.mid(0,2);
  QString ss = t.mid(3, 2);
  int m = mm.toInt();
  int s = ss.toInt();
  int time = m*60*1000 + s*1000;
  showWord(time);
}

void MainWindow::seekChange(int position)
{
  Player -> setPosition(position * 1000);//如果滑块改变位置,则改变音乐进度
  moved = position * 1000;//让播放时间等于音乐进度(毫秒)
  QTime moveTime(0,(moved/60000) % 60,(moved / 1000) % 60);//设置时间
  ui->showPro ->setText(moveTime.toString("mm:ss"));//显示时间

}

void MainWindow::musicTime(){

        qint64 time = Player->duration();
        QTime Time(0,(time % (1000 * 60 * 60)) / (1000 * 60),(time % (1000 * 60)) / 1000);
          ui->MusicTime->setText(Time.toString("mm:ss"));
        qDebug()<<"time:"<<Time;

}


void MainWindow::showWord(int time)
{
  if(map.contains(time))
  {
    ui->label1->setText(map.value(time));

  }
  else{
    qDebug()<<"继续上一句歌词";
  }
}

void MainWindow::getHeader(const char *str, QString &des)
{
  des = des.remove(str);
  des = des.remove("]");
}

void MainWindow::getTime(QString line)//获取lrc文件的每句的时间
{
  if(line.startsWith("["))
  {
    int index = line.indexOf("]");
    QString t = line.mid(1, index - 1);
    QString mm = t.mid(0,2);
    QString ss = t.mid(3, 2);
    int m = mm.toInt();
    int s = ss.toInt();
    int time = m*60*1000 + s*1000;
    t = line.mid(index + 1);
    index = t.lastIndexOf("]");
    if(index < 0)
    {
      map.insert(time, t);
    }
    else
    {
      t = t.mid(index + 1);
      map.insert(time, t);
      getTime(t);
      qDebug()<<"time123:"<<time;
    }
  }
}

void MainWindow::initlrc(const QString& fileName)
{
  QMap<int, QString> map;
  QString l;
  QFile file("C:Users44637MusicQTLrc"+fileName);
  if(file.exists()){
    qDebug()<<"文件存在";
  }
  else{
    qDebug()<<"文件不存在";
  }

  if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
    return;
  }

  QTextCodec *codec = QTextCodec::codecForName("GBK");
  while(!file.atEnd())
  {

    QString line = codec->toUnicode(file.readLine());
    QString s(line);
    if(s.length()<4)
          continue;
        if(s.startsWith("[ti:"))
        {
          getHeader("[ti:", s);
          map.insert(0, s);
          ui->topmusicname->setText(s);
          continue;
        }
        else if(s.startsWith("[ar:"))
        {
          getHeader("[ar:", s);
          map.insert(1000, s);
          ui->singer->setText("歌手:"+s);
          continue;
        }
        else if(s.startsWith("[al:"))
        {
          getHeader("[al:", s);
          map.insert(2000, s);
          ui->album->setText("专辑:"+s);
          continue;
        }
        else if(s.startsWith("[by:"))
        {
          getHeader("[by:", s);
          map.insert(3000, s);
          continue;
        }
        else
        {

          getTime(s);
        }

}
  file.close();

}


void MainWindow::button_style(){
  ui->Buttonstart->setIcon(QIcon("E:QTQTcodeMusicPlayericonstart.jpg"));
  ui->Buttonlast->setIcon(QIcon("E:QTQTcodeMusicPlayericonlast.jpg"));
  ui->Buttonnext->setIcon(QIcon("E:QTQTcodeMusicPlayericonnext.png"));
  ui->Buttonmute->setIcon(QIcon("E:QTQTcodeMusicPlayericonvolume.jpg"));
  ui->Buttonvideo_qr->setIcon(QIcon("E:QTQTcodeMusicPlayericonMV.png"));
  ui->Buttonvideo_wm->setIcon(QIcon("E:QTQTcodeMusicPlayericonMV.png"));
  ui->Buttonvideo_cq->setIcon(QIcon("E:QTQTcodeMusicPlayericonMV.png"));  
}


void MainWindow::changestartbutton(){
  if(isPlay)
  ui->Buttonstart->setIcon(QIcon("E:QTQTcodeMusicPlayericonpause.jpg"));
  else
  ui->Buttonstart->setIcon(QIcon("E:QTQTcodeMusicPlayericonstart.jpg"));
}

void MainWindow::cleanmap(){
  map.clear();
}


void MainWindow::playto(int i,int )
{
  PlayerList->setCurrentIndex(i);
  isPlay=true;
  changestartbutton();
  QString musicLrc=lrcList.at(i);
  initlrc(musicLrc);
  Player->play();
}


void MainWindow::video_click_wm(){
  v1= new VideoPlayer(this);
  v1->setModal(false);
  v1->show();
}

void MainWindow::video_click_qr(){
  v_qr= new videoplayer_qr(this);
  v_qr->setModal(false);
  v_qr->show();
}

void MainWindow::video_click_cq(){
  v_cq= new videoplayer_cq(this);
  v_cq->setModal(false);
  v_cq->show();
}

void MainWindow::mute(){
  if(!ismute){
  Player -> setVolume(0);
  //ui->voiceslider->value();
  ui->Buttonmute->setIcon(QIcon("E:QTQTcodeMusicPlayericonmute.png"));
  ismute=true;
  }
  else{
  Player -> setVolume(100);
  ui->Buttonmute->setIcon(QIcon("E:QTQTcodeMusicPlayericonvolume.jpg"));
  ismute=false;
  }
}

void MainWindow::fastForward(){
  qint64 position=Player->position();
  qDebug()<<"position"<<position;
  position=position+5000;
  ui->Progressbar->setValue(position/1000);
  Player -> setPosition(position);//如果滑块改变位置,则改变音乐进度
}

void MainWindow::fastBack(){
  qint64 position=Player->position();
  qDebug()<<"position"<<position;
  position=position-5000;
  ui->Progressbar->setValue(position/1000);
  Player -> setPosition(position);//如果滑块改变位置,则改变音乐进度

}