qt5.2音乐播放器的播放功能

qt5.2并没有了phonon 模块 ,在播放音频视频的时候可以使用QMediaplayer来实现。

    //创建媒体
    player=new QMediaPlayer(this);
    //创建播放列表,并在列表里添加两首歌曲
    mediaList=new QMediaPlaylist;
    mediaList->addMedia(QUrl::fromLocalFile("E:/360Downloads/Software/Qt5.2/Tools/QtCreator/bin/video/nfdsm.mp3"));
    mediaList->addMedia(QUrl::fromLocalFile("E:/360Downloads/Software/Qt5.2/Tools/QtCreator/bin/video/MP3/ljf.mp3"));
    //设置播放列表中的当前歌曲为第几首
    mediaList->setCurrentIndex(1);
    //为播放器添加播放列表
    player->setPlaylist(mediaList);
    player->setVolume(volumn);
 
    //播放器开始播放列表中的歌曲
    player->play();
关于中文路径,目前还没有找到方法,所以只好用英文路径代替

为整个窗口设置背景色

 //为整个窗口设置背景色
    QPalette palette;
    palette.setBrush(QPalette::Background,QBrush(QPixmap(":/image/sz")));
    this->setPalette(palette);

  connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(positionChanged(qint64)));
  //持续信号,使整个滑动条能够持续前进
  connect(player, SIGNAL(durationChanged(qint64)), this, SLOT(durationChanged(qint64)));
  void Widget::durationChanged(qint64 duration)
 {
    ui->horizontalSlider->setRange(0,duration);
 }
//通过滚动条控制音量为滚动条添加信号
void Widget::on_horizontalSlider_2_valueChanged(int value)
{
    player->setVolume(value);
}

实现播放上一首,下一首,暂停或继续播放等功能。
//播放上一首歌曲
void Widget::on_pre_clicked()
{
mediaList->previous();
player->play();
}
//播放下一首歌曲
void Widget::on_next_clicked()
{
 int currentIndex=mediaList->currentIndex();
 if(++currentIndex==mediaList->mediaCount())
  currentIndex=0;
 mediaList->setCurrentIndex(currentIndex);
}
//暂停或是继续播放
void Widget::on_pos_clicked()
{
    if(ui->pos->text()==tr("ps"))
    {
        player->pause();
        ui->pos->setText(tr("cn"));
    }
    else
    {
        player->play();
        ui->pos->setText(tr("ps"));
    }
}
//当单击某行单元格时,显示改行单元格所对应的歌曲
 connect(ui->tableWidget,SIGNAL(cellClicked(int,int)),this,SLOT(playTo(int))); 所调用的槽函数为playTo
 //设置点击的是哪首歌曲
void Widget::playTo(int i)
{
    mediaList->setCurrentIndex(i);
    player->play();
}


也可以选择不同的播放方式:
//选择播放方式
void Widget::on_orderComboBox_currentIndexChanged(int index)
{
    if(index==0)
    {
        mediaList->setPlaybackMode(QMediaPlaylist::Sequential);//顺序播放
    }
    else
    {
        if(index==1)
         {
            mediaList->setPlaybackMode(QMediaPlaylist::Random); //随机播放
         }
        else
        {
           if(index==2)
           {
              mediaList->setPlaybackMode(QMediaPlaylist::Loop); //列表循环
           }
           else
           {
              mediaList->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop); //单曲循环
           }
        }
    }
}

 
 可以批量导入歌曲,具体代码如下所示:
//导入歌曲
void Widget::on_daoru_clicked()
{
    QString initialName=QDir::homePath();//返回一个用户的全路径
    QStringList pathList=QFileDialog::getOpenFileNames(this, codeChange("选择文件"), initialName, tr(".mp3"));
    for(int i=0; i<pathList.size(); ++i)
    {
        QString path=QDir::toNativeSeparators(pathList.at(i)); //把斜杠转化成反斜杠
        if(!path.isEmpty())
        {
            mediaList->addMedia(QUrl::fromLocalFile(path));//加入到播放列表
            QString fileName=path.split("\\").last();//用斜杠分开,取最后一个名字
            int rownum=ui->tableWidget->rowCount();
            ui->tableWidget->insertRow(rownum);//为整个table插入一行行号为rownum,也就是说一首歌的信息占据一行的位置
            ui->tableWidget->setItem(rownum, 0, new QTableWidgetItem(fileName.split(".").front()));
            ui->tableWidget->setItem(rownum, 1, new QTableWidgetItem(fileName.split(".").last()));
            ui->tableWidget->setItem(rownum,2,new QTableWidgetItem(path));
            ui->tableWidget->item(rownum,1)->setFlags(Qt::NoItemFlags);
            ui->tableWidget->item(rownum,2)->setFlags(Qt::NoItemFlags);
        }
    }
}
显示歌词这部分是把歌词显示在textedit上,并没有实现桌面歌词的显示,具体代码如下所示:
//当单击某行单元格时,根据各歌曲名找到对应的歌词
connect(ui->tableWidget,SIGNAL(cellClicked(int,int)),this,SLOT(geCi(int)));
//显示歌词部分
void Widget::geCi(int z)
{
    if(ui->checkBox->isChecked()==true)
    {
        QString str=ui->tableWidget->item(z,0)->text();
        qDebug()<<str;
        QFile file("E:/360Downloads/Software/Qt5.2/Tools/QtCreator/bin/video/"+str+".lrc");
        if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
        {
            QMessageBox::information(this, tr("information"), codeChange("当前目录下未找到歌词文件"));
        }
        else
        {
            QTextStream in(&file);
            QString result=in.readAll();
            QTextEdit *edit=new QTextEdit();
            edit->setFixedHeight(300);
            edit->setFixedWidth(293);
            edit->setText(result);
            edit->show();
        }
    }
}

搜索歌曲部分,可以实现全名搜索,代码如下所示:
//搜索歌曲
void Widget::on_go_clicked()
{
  QStringList list;        //存放的是歌曲名
  QStringList list1;       //存放的是歌曲类型
  QStringList list2;       //存放的是歌曲路径
  QStringList list3;       //搜索得同样的歌曲名
  QStringList list4;       //存放歌曲类型
  QStringList list5;       //存放歌曲路径
  if(!ui->lineEdit->text().isEmpty())
  {
      for(int i=0;i<ui->tableWidget->rowCount();i++)
      {
          QString str=ui->tableWidget->item(i,0)->text();
          QString str1=ui->tableWidget->item(i,1)->text();
          QString str2=ui->tableWidget->item(i,2)->text();
          list<<str;
          list2<<str1;
          list3<<str2;
      }
      qDebug()<<list.size();
    QString sousuo=  ui->lineEdit->text();
    qDebug()<<sousuo;
    for(int s=0;s<list.size();s++)
    {
        if(list.at(s)==sousuo)
        {
            list1<<list.at(s);
            list4<<list2.at(s);
            list5<<list3.at(s);
            ui->tableWidget->clearContents();
            for(int x=0;x<list1.size();x++)
            {
                ui->tableWidget->setItem(x,0,new QTableWidgetItem(list1.at(x)));
                ui->tableWidget->setItem(x,1,new QTableWidgetItem(list4.at(x)));
                ui->tableWidget->setItem(x,2,new QTableWidgetItem(list5.at(x)));
                ui->tableWidget->item(x,1)->setFlags(Qt::NoItemFlags);
                ui->tableWidget->item(x,2)->setFlags(Qt::NoItemFlags);
                QString path=QDir::toNativeSeparators(list1.at(x));
                //mediaList->clear();
                mediaList->addMedia(QUrl::fromLocalFile(path));
                player->setPlaylist(mediaList);
                player->play();
                mediaList->setCurrentIndex(s);
            }
                break;
        }
        else
        {
            if(s==list.size()-1)
            {
            QMessageBox::about(this,codeChange("提示信息"),codeChange("未找到符合的歌曲"));
            }
        }
    }
  }
}

删除歌曲部分代码如下所示:
//删除歌曲
void Widget::on_pushButton_clicked()
{
    QString str=codeChange("确定要删除该首歌曲吗?");
    qDebug()<<str;
    if (QMessageBox::Yes == QMessageBox::question(this,
    tr("Question"),
    str,
    QMessageBox::Yes | QMessageBox::No,
    QMessageBox::Yes)) {
    player->EndOfMedia;
    ui->tableWidget->removeRow(mediaList->currentIndex());
    QMessageBox::information(this, tr("information"), codeChange("删除成功"));
    } else {
    QMessageBox::information(this,tr("information"),codeChange("取消删除"));
}
}

收藏歌曲代码如下所示:
//收藏歌曲
void Widget::on_pushButton_2_clicked()
{
    int row=mediaList->currentIndex();
    qDebug()<<ui->tableWidget->item(row,1)->text();
    qDebug()<<ui->tableWidget->item(row,2)->text();
    int rownum=ui->shoucang->rowCount();
    ui->shoucang->insertRow(rownum);
    ui->shoucang->setItem(rownum,0,new QTableWidgetItem(ui->tableWidget->item(row,0)->text()));
    ui->shoucang->setItem(rownum,1,new QTableWidgetItem(ui->tableWidget->item(row,1)->text()));
    ui->shoucang->setItem(rownum,2,new QTableWidgetItem(ui->tableWidget->item(row,2)->text()));
    ui->shoucang->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->shoucang->item(rownum,1)->setFlags(Qt::NoItemFlags);
    ui->shoucang->item(rownum,2)->setFlags(Qt::NoItemFlags);
    QMessageBox::information(this,tr("information"),codeChange("该歌曲成功加入收藏列表"));
}

 
关于系统托盘,如图所示:
可以这样实现。点击右键可以看到菜单,包括上一首,下一首,暂停或播放,关于酷我,关于我们等等。
代码如图所示:
    trayicon = new QSystemTrayIcon(this);
    trayiconMenu=new QMenu(this);
    pre=new QAction(QIcon(":/image/sys"),codeChange("上一首"),this);
    next=new QAction(QIcon(":/image/xys"),codeChange("下一首"),this);
    zanting=new QAction(QIcon(":/image/zt"),codeChange("暂停"),this);
    guanyu=new QAction(codeChange("关于酷我"),this);
    quit=new QAction(QIcon(":/image/stop"),codeChange("退出"),this);
    wangzhi=new QAction(codeChange("关于我们"),this);
    trayiconMenu->addAction(pre);
    trayiconMenu->addAction(quit);
    trayiconMenu->addAction(next);
    trayiconMenu->addAction(zanting);
    trayiconMenu->addAction(guanyu);
    trayiconMenu->addAction(wangzhi);
    //点击菜单中的退出时,退出程序
    connect(quit, SIGNAL(triggered()), qApp, SLOT(quit()));
    //点击菜单中的上一首时,切换到上一首歌曲
    connect(pre, SIGNAL(triggered()), this, SLOT(on_pre_clicked()));
    //点击菜单中的下一首时,切换到下一首歌曲
    connect(next, SIGNAL(triggered()), this, SLOT(on_next_clicked()));
    //点击菜单中的关于酷我时,显示酷我音乐的信息
    connect(guanyu, SIGNAL(triggered()), this, SLOT(support()));
    //点击菜单中的暂停时,使歌曲暂停
    connect(zanting, SIGNAL(triggered()), this, SLOT(on_pos_clicked()));
    //点击菜单的关于我们时,显示网址
    connect(wangzhi, SIGNAL(triggered()), this, SLOT(aboutUs()));   
    trayicon->setContextMenu(trayiconMenu);
    trayicon->setIcon(QIcon(":/image/icon.ico"));//显示托盘图标
    trayicon->setToolTip(codeChange("酷我音乐盒"));
    trayiconMenu = new QMenu(this);
    trayicon->show();
    //为系统托盘绑定单击信号的槽 即图标激活时
    connect(trayicon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason)));   
    void Widget::onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason reason)
 {
    switch(reason)
   {
  //单击
   case QSystemTrayIcon::Trigger:
   //双击
   case QSystemTrayIcon::DoubleClick:
      //恢复窗口显示
      this->setWindowState(Qt::WindowActive);
      this->show();
      break;
   default:
      break;
   }
 }
其中音乐播放器还有很多小bug,请多多指正。
 
 
 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页