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

2023-11-03

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;
   }
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt5.2音乐播放器的播放功能 的相关文章

随机推荐

  • Mysql锁机制简单了解一下

    历史文章推荐 可能是最漂亮的Spring事务管理详解 面试中关于Java虚拟机 jvm 的问题看这篇就够了 Java NIO 概览 关于分布式计算的一些概念 一 锁分类 按照锁的粒度分类 Mysql为了解决并发 数据安全的问题 使用了锁机制
  • 深度学习框架是做什么的

    3分钟看懂旷视深度学习框架天元MegEngine
  • c++中调用复制构造函数的三种情况

    普通构造函数是在对象创建时被调用 而复制构造函数在以下三种情况下会被调用 1 当用类的一个对象去初始化该类的另一个对象时 例如 Point a 1 2 Point b a 调用复制构造函数 Point c a 同上 2 如果函数的形参是类的
  • weex dom.scrollToElement 滚动问题

    使用weex 的dom scrollToElement 兼容问题 1 使用for生成的ref 在初始化获取ref节点时候需要有100ms延迟 2 dom scrollToElement 传入的 ref参数 需要使用this refs ref
  • DNS中的正向解析与反向解析 及 nslookup命令使用

    DNS中的正向解析与反向解析 Jackxin Xu IT技术专栏 博客频道 CSDN NET http blog csdn net jackxinxu2100 article details 8145318 正向解析 通过域名查找ip 反向
  • 黑盒测试方法之因果图和判定表——三

    前面文章 黑盒测试方法之因果图和判定表 一 主要讲述判定表驱动法的相关理论内容 黑盒测试方法之因果图和判定表 二 主要讲述因果图相关理论内容 4 因果图加判定表设计测试用例实例 这里以一个 软件评测师教程 上面的例子为例 来说明和演示因果图
  • GAN(初步学习)

    GAN的原理介绍 GAN的主要灵感来源于博弈论中零和博弈的思想 应用到深度学习神经网络上来说 就是 通过生成网络G Generator 和判别网络D Discriminator 不断博弈 进而使G学习到数据的分布 如果用到图片生成上 则训练
  • Zotero 相关学习链接

    参考链接 https www zotero org support zh start https github com l0o0 translators CN https www zhihu com question 21518558 ht
  • ROS串口通信(1)环境搭建

    ROS串口通信 1 环境搭建 引言 1 ubuntu串口驱动安装和使用 1 1 安装 1 2 使用 1 3 Ubuntu 查看串口 设置串口权限 2 Ubuntu下的串口助手cutecom 引言 无疑 串口的调试需要联合串口助手调试更加方便
  • 软件测试2019:第一次作业

    就是利用测试工具按照测试方案和流程对产品进行功能和性能测试 甚至根据需要编写不同的测试工具 设计和维护测试系统 对测试方案可能出现的问题进行分析和评估 执行测试用例后 需要跟踪故障 以确保开发的产品适合需求 使用人工或者自动手段来运行或测试
  • 三分钟拥有自己的 chat-gpt (开发到上线)

    三分钟拥有自己的 chat gpt 开发到上线 首先你需要有一个 laf 账号 如果你还不知道 laf 是什么 点击这里三分钟学会 然后你还需要有一个 chat gpt 的账号并且生成一个 apiKey 这一步可以问 Google 云函数
  • Centos 7 阿里yum源及epel源配置

    1 下载阿里yum配置文件 wget O etc yum repos d CentOS Base repo http mirrors aliyun com repo Centos 7 repo 2 下载阿里epel配置文件 wget O e
  • ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26‘ not found

    在运行程序的时候报错 import cv2 ImportError usr lib x86 64 linux gnu libstdc so 6 version GLIBCXX 3 4 26 not found required by hom
  • 【STM32内部架构理解】

    STM32和GD32F10X内部架构 整体架构 模块架构 总线矩阵 最开始学stm32开始对架构各部分不是很了解看架构图基本上走马观花 然后陷入对各个外设的投入中去 比如GPIO ADC CAN等 但是对整体架构的掌握对后面编程很多细节的理
  • 列表首屏毫秒级加载与自动滚动定位方案

    引用自 摸鱼wiki 场景
  • 利用libuv编写异步多线程的addon实例

    转载自 http snoopyxdy blog 163 com blog static 601174402013422103614385 最近cnode上很多TX在问关于node的异步回调以及单线程的事情 今天看了libuv的一些api和d
  • 微信小程序启动自动检测版本更新,检测到新版本则提示更新

    UpdateManager 对象 用来管理更新 可通过 wx getUpdateManager 接口获取实例 在app js中的示例代码 onShow 获取小程序更新机制的兼容 由于更新的功能基础库要1 9 90以上版本才支持 所以此处要做
  • 垃圾分类资料汇总

    目录 一 前言 二 垃圾分类话题简介 三 当前存在的一些有用参考资源 四 当前存在的垃圾分类小程序或者APP 五 当前规模比较大的产品 六 个人想法 参考资料 注意事项 一 前言 自从上海实行了垃圾分类之后 垃圾分类这个话题就成为了一个热点
  • 蓄水池抽样算法(Reservoir Sampling)

    蓄水池抽样算法 Reservoir Sampling 问题描述 问题分析 代码实现 数学证明 问题描述 给定一个数据流 数据流长度N很大 且长度不可预知 问如何在仅遍历一次数据的情况下 如何等概率 抽取m个样本 问题分析 首先明确概念 等概
  • qt5.2音乐播放器的播放功能

    qt5 2并没有了phonon 模块 在播放音频视频的时候可以使用QMediaplayer来实现 创建媒体 player new QMediaPlayer this 创建播放列表 并在列表里添加两首歌曲 mediaList new QMed