Qt:音乐播放器

写在前面(学习Qt的记录):因为最初的程序设计问题,造成代码的耦合性很高,各个功能函数都集中在主函数中,某些功能未有完全实现(左边树列表点下一首时,继续播放在左列表的),记录经验,吸取教训;代码就贴的主要功能,还有XML文件配置等没贴出,下面是运行效果图。


以下为各个功能函数:

1.整体可拖动窗口:

声明:

//整体可拖动窗口
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
定义:

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)//只响应左键
    {
        m_draging = true;
        m_startPostion = event->globalPos();
        m_framePostion = frameGeometry().topLeft();
    }
    QWidget::mousePressEvent(event);//调用父类保持原有按键行文
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)
    {
        QPoint offset = event->globalPos() - m_startPostion;
        move(m_framePostion+offset);
    }
    QWidget::mouseMoveEvent(event);
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    m_draging = false;
    QWidget::mouseReleaseEvent(event);
}
左列表双击播放:
//左菜单双击播放
void MainWindow::treewidgetMusic(QString leftMusic)
{
    int count = ui->MusicWidget->count();
    for(int i = 0;i < count; i++)
    {
        if(leftMusic == ui->MusicWidget->item(i)->text())	//比较右边列表的歌名,此方法有缺陷。
        {
            m_playList->setCurrentIndex(i);
            m_player->play();
            timer->start(1000);


            QIcon icon("D:/QT_Library/MusicPlayer/icon/newStop.png");
            ui->playerButton->setIcon(icon);
            player_stop = false;

            ui->pregressHorizontalSlider->setEnabled(true);
            ui->lastButton->setEnabled(true);
            ui->nextButton->setEnabled(true);
            ui->delButton->setEnabled(true);
            ui->playerButton->setEnabled(true);
        }
    }
}

右键菜单(槽函数连接):

QAction *m_Love;
QAction *m_Try;

void MainWindow::creatAction()
{
    m_Love = new QAction("添加到My-Love",this);
    m_Try = new QAction("添加到Try-hear",this);
}

void MainWindow::showRightMenu(QPoint pos)
{
    QMenu *menu = new QMenu;
    menu->addAction(m_Love);
    menu->addAction(m_Try);
    if(ui->MusicWidget->currentItem())
    {
//        menu->exec(QCursor::pos());
        menu->exec(ui->MusicWidget->mapToGlobal(pos));//全局坐标显示
    }
}
播放暂停:

//播放/暂停
void MainWindow::OnPlayBtnClicked()
{
    ui->pregressHorizontalSlider->setEnabled(true);
    //正在播放showLabe显示
    ui->showLabel->setText(ui->MusicWidget->currentItem()->text());
    if((player_stop == false)
            || (m_player->state() ==  QMediaPlayer::PlayingState))
    {
        timer->stop();
        m_player->pause();
        QIcon icon("D:/QT_Library/MusicPlayer/icon/newPlayer.png");
        ui->playerButton->setIcon(icon);
        player_stop = true;
    }
    else
        if((player_stop == true)
                || (m_player->state() == QMediaPlayer::PausedState))
        {
            timer->start(1000);
            m_player->play();
            QIcon icon("D:/QT_Library/MusicPlayer/icon/newStop.png");
            ui->playerButton->setIcon(icon);
            player_stop = false;
        }
}
双击播放:

void MainWindow::OnDoubleClicked(QModelIndex index)
{
    player_stop = true;
    ui->pregressHorizontalSlider->setEnabled(true);
    ui->lastButton->setEnabled(true);
    ui->nextButton->setEnabled(true);
    ui->delButton->setEnabled(true);
    ui->playerButton->setEnabled(true);

    QIcon icon("D:/QT_Library/MusicPlayer/icon/newStop.png");
    ui->playerButton->setIcon(icon);
    player_stop = false;

    ui->showLabel->setText(ui->MusicWidget->currentItem()->text());
    m_playList->setCurrentIndex(ui->MusicWidget->currentIndex().row() );

    m_player->play();
    timer->start(1000);

    time.setDate(date);//所以上边的data初始化时,数值不为0就好
    time.setTime(timeProgress);
}
上一首:
//上一首
void MainWindow::LastMusic()
{
//    ui->playerButton->setText("暂停");
    QIcon icon("D:/QT_Library/MusicPlayer/icon/newStop.png");
    ui->playerButton->setIcon(icon);
    player_stop = false;

    m_player->setPosition(0);
    ui->pregressHorizontalSlider->setValue(m_player->position());

    //这里注意的是,和我们正常数数一样,mediaCount是从1开始计数的
    if(m_playList->currentIndex()!=0)
    {
        m_playList->setCurrentIndex(m_playList->previousIndex());
        m_playList->previous();
        m_player->play();
    }
    else
    {
        m_playList->setCurrentIndex(m_playList->mediaCount()-1);
        m_player->play();
    }
}
下一首:
//下一首
void MainWindow::NextMusic()
{
    QIcon icon("D:/QT_Library/MusicPlayer/icon/newStop.png");
    ui->playerButton->setIcon(icon);
    player_stop = false;
    m_player->setPosition(0);
    ui->pregressHorizontalSlider->setValue(m_player->position());

    //这里注意的是,和我们正常数数一样,mediaCount是从1开始计数的
    if(m_playList->mediaCount() - m_playList->currentIndex()!=1)
    {
        m_playList->setCurrentIndex(m_playList->nextIndex());
        m_player->play();
    }
    else
    {
        m_playList->setCurrentIndex(0);
        m_player->play();
    }
}
播放模式:
//播放模式
void MainWindow::OnConBoxChangeClicked(int number)
{
    switch (number)
    {
    case 0:
        m_playList->setPlaybackMode(QMediaPlaylist::Loop);//循环列表
        qDebug() << "0";
        break;
    case 1:
        m_playList->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);//当前单曲循环
        qDebug() << "1";
        break;
    case 2:
        m_playList->setPlaybackMode(QMediaPlaylist::Random);//随机
        qDebug() << "2";
        break;
    default:
        break;
    }
}
音量调节:
//音量调节
void MainWindow::OnVolumeChange(int volume)
{
    m_player->setVolume(volume);
}
快进:
//快进
void MainWindow::HorizontalSliderChange(int value)
{
    if(m_player->state() == QMediaPlayer::PlayingState)
    {
       m_player->setPosition(value);
       m_player->pause();
       QIcon icon("D:/QT_Library/MusicPlayer/icon/newPlayer.png");
       ui->playerButton->setIcon(icon);
       player_stop = true;
    }
    m_player->play();
    QIcon icon("D:/QT_Library/MusicPlayer/icon/newStop.png");
    ui->playerButton->setIcon(icon);
    player_stop = false;
}
进度条跟随:
//进度条跟随
void MainWindow::ChangPostion()
{
    //music->position()获取音乐当前播放位置
    curr_position = m_player->position();

    //music->duration()获取音乐总长度(注意:这个长度是音乐大小)
    ui->pregressHorizontalSlider->setMaximum(m_player->duration());

    if(curr_position >= ui->pregressHorizontalSlider->maximum())//播放完毕
    {
        timer->stop();
        m_player->stop();
        QIcon icon("D:/QT_Library/MusicPlayer/icon/newPlayer.png");
        ui->playerButton->setIcon(icon);
        player_stop = true;

        ui->pregressHorizontalSlider->setSliderPosition(0);
        time.setDate(date);
        time.setTime(timeProgress);//重新把时间标签改为00:00
        m_playList->next();
    }
    timer->start(1000);
    m_player->play();
    //刷新滑块位置
    ui->pregressHorizontalSlider->setSliderPosition(curr_position);
}
实时播放时间:
//实时时间
void MainWindow::upTime(qint64 position)
{  

    QTime duration(0, position / 60000, qRound((position % 60000) / 1000.0));
    ui->startTimeLabel->setText(duration.toString("mm:ss"));
    if(!(m_playList->isEmpty()))
    {
        //当前播放歌曲在列表醒目提示
        ui->MusicWidget->setCurrentRow(m_playList->currentIndex());
        //正在播放showLabe显示
        ui->showLabel->setText(ui->MusicWidget->currentItem()->text());
    }
}
播放总时间:
//播放总时长
void MainWindow::endTime(qint64 position)
{
    if(m_player->state() == QMediaPlayer::PlayingState)
    {
        QTime duration(0, position / 60000, qRound((position % 60000) / 1000.0));
        ui->endTimelabel->setText(duration.toString("mm:ss"));
    }
}
删除歌曲:
//删除
void MainWindow::delBtnClicked()
{
    QListWidgetItem *item = ui->MusicWidget->currentItem();
    ui->MusicWidget->removeItemWidget(item);
    delete item;

    if(m_playList->mediaCount() > 1)
    {
        qDebug() << "++++++++++++++++++++";
        qDebug() << m_playList->mediaCount();
        m_playList->removeMedia(m_playList->currentIndex());
        m_player->EndOfMedia;
    }
    else
        if(m_playList->mediaCount() == 1)
        {
            qDebug() << "--------------";
            qDebug() << m_playList->mediaCount();
            m_playList->clear();
            m_player->stop();
            timer->stop();
            ui->showLabel->clear();
            ui->MusicWidget->clear();
            ui->playerButton->setDisabled(true);
            ui->pregressHorizontalSlider->setDisabled(true);
            ui->nextButton->setDisabled(true);
            ui->lastButton->setDisabled(true);
            ui->delButton->setDisabled(true);
        }
}
美化相关:
//Qcombox美化设置/委托
    QStyledItemDelegate* itemDelegate = new QStyledItemDelegate();
    ui->comboBox->setItemDelegate(itemDelegate);

    //允许鼠标右键操作
    ui->MusicWidget->setContextMenuPolicy(Qt::CustomContextMenu);

    //关闭滚动条
    ui->MusicWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->MusicWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setWindowFlags(Qt::Window | Qt::FramelessWindowHint);//无边框设置
setAttribute(Qt::WA_TranslucentBackground);//设置背景透明
主设计界面(偷懒,皮肤直接用的styleSheet)


具体代码:

源码下载

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 关于 Easy Player: Easy Player 是由于个人兴趣而制作的一款基于Qt的在线音乐播放器 目前是第一个版本 并未进行足量优化 因此 在使用过程中可能存在某些Bug 请谅解 2 功能介绍: 目前功能支持歌曲在线搜索 单曲循环(其他循环方式后期添加添加搜索结果到试听列表 下载音乐到本地 歌词同步显示 还不能同步滚动 3 使用方法: (1)首先 从按钮说起: 左边第一排:播放(暂停) 下一首 单曲循环 下载当前歌曲 歌词显示; 左边第二排:音量键 右边第一排:歌曲时间轴 (2)其次 搜索: “歌曲特征”输入关键词搜索 会呈现搜索结果在搜索列表 搜索列表右边的按钮表示添加歌曲到播放列表 (3)最后 播放列表: 在歌曲列表中双击歌曲播放 右边的按钮表示下载歌曲 目前是下载完成之后才会提示 之后会做一个下载列表界面 4 其他 本来打算在下载的时候加入多线程 另外加一个数据库保存播放信息 但由于时间关系 并没有在这个版本加入 之后的版本会不断完善 欢迎大家下载测试和提意见 声明:代码仅供参考 请尊重原创 作者:Reyn 博客地址:http: blog csdn net jan5 reyn">1 关于 Easy Player: Easy Player 是由于个人兴趣而制作的一款基于Qt的在线音乐播放器 目前是第一个版本 并未进行足量优化 因此 在使用过程中可能存在某些Bug 请谅解 2 功能介绍: 目前功能支持歌曲在线搜索 单曲 [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值