14. 播放相关按钮功能实现

一、播放按钮处理

根据歌曲播放的状态,切换播放按钮的图标:

  • 播放状态

  • 非播放状态

[signal] void QMediaPlayer::mediaStatusChanged(QMediaPlayer::MediaStatus status)
Signals that the status of the current media has changed.

[signal] void QMediaPlayer::stateChanged(QMediaPlayer::State state)
Signal the state of the Player object has changed.

class MusicItem :  public QObject,public QGraphicsItem
{
    Q_OBJECT
    Q_PROPERTY(qreal angle READ rotation WRITE setRotation)
​
public:
    void resumeAnimation(void);
};
​
void MusicItem::resumeAnimation()
{
    if(animation->state() == QPropertyAnimation::Paused){
        animation->resume();
    }
}
class MusicSence : public QObject
{
    Q_OBJECT
public:
    void stopAnimation(void);
    void resumeAnimation(void);
};
​
void MusicSence::stopAnimation()
{
    diskItem->pauseAnimation();
    needleItem->pauseAnimation();
}
​
void MusicSence::resumeAnimation()
{
    diskItem->resumeAnimation();
    needleItem->resumeAnimation();
}
class CloudMusicWindow : public QMainWindow
{
private slots:
    void handlePlayerState(QMediaPlayer::State state);
    void on_playButton_clicked();
​
};
​
CloudMusicWindow::CloudMusicWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::CloudMusicWindow)
{
​
    musicPlayer = new MusicPlayer(this);
    connect(musicPlayer,&MusicPlayer::stateChanged,
            this,&CloudMusicWindow::handlePlayerState);
}
​
void CloudMusicWindow::handlePlayerState(QMediaPlayer::State state)
{
    if(state == QMediaPlayer::PlayingState){
        ui->playButton->setProperty("state","Playing");
    }else{
        ui->playButton->setProperty("state","NoPlaying");
        musicSence->stopAnimation();
    }
​
    ui->playButton->style()->unpolish(ui->playButton);
    ui->playButton->style()->polish(ui->playButton);
    ui->playButton->update();
}
​
void CloudMusicWindow::on_playButton_clicked()
{
    if(musicPlayer->state() == QMediaPlayer::PlayingState){
        musicPlayer->pause();
    }else{
       if(musicPlayer->state() == QMediaPlayer::PausedState){
           musicSence->resumeAnimation();
       }else{
           musicSence->startAnimation();
       }
       musicPlayer->play();
    }
}

二、上一首、下一首按钮处理

class CloudMusicWindow : public QMainWindow
{
public:
    void playTableMusic(QTableWidget *musicTable,int row);
    
private slots:
    void on_tabWidget_currentChanged(int index);
       
private:
    QTableWidget *musicTable;
};
​
CloudMusicWindow::CloudMusicWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::CloudMusicWindow)
{
    ui->tabWidget->setCurrentIndex(1);
    musicTable = ui->networkMusicTable;
    initMusicTable(ui->networkMusicTable);
}
​
void CloudMusicWindow::on_tabWidget_currentChanged(int index)
{
    musicTable = index ? ui->networkMusicTable : ui->localMusicTable;
}
​
void CloudMusicWindow::playTableMusic(QTableWidget *musicTable, int row)
{
    QString mp3Url   = musicTable->item(row,0)->text();
    QString lyricUrl = musicTable->item(row,1)->text();
    QString albumUrl = musicTable->item(row,2)->text();
    qDebug() << "mp3Url:" << mp3Url;
​
    playMusic(QStringList()<< mp3Url << lyricUrl << albumUrl);
​
    return;
}
//下一首按钮处理
void CloudMusicWindow::on_nextMusicButton_clicked()
{
    int totalRow   = musicTable->rowCount();
    if(!totalRow){
        return;
    }
​
    int currentRow = musicTable->currentRow();
    int row = currentRow < totalRow - 1 ? currentRow + 1 : 0;
    musicTable->selectRow(row);
    playTableMusic(musicTable,row);
​
    return;
}
//上一首歌处理
void CloudMusicWindow::on_preMusicButton_clicked()
{
    int totalRow   = musicTable->rowCount();
    if(!totalRow){
        return;
    }
​
    int currentRow = musicTable->currentRow();
    int row = currentRow > 0 ? currentRow - 1 : totalRow - 1;
    musicTable->selectRow(row);
    playTableMusic(musicTable,row);
​
    return;
}

三、随机播放按钮处理

class CloudMusicWindow : public QMainWindow
{
public:
   void handlePlayerMediaStatus(QMediaPlayer::MediaStatus status);
    
private slots:
   void on_randMusicButton_clicked();
       
};
​
CloudMusicWindow::CloudMusicWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::CloudMusicWindow)
{
    musicPlayer = new MusicPlayer(this);
    connect(musicPlayer,&MusicPlayer::mediaStatusChanged,
            this,&CloudMusicWindow::handlePlayerMediaStatus);
}
​
void CloudMusicWindow::handlePlayerMediaStatus(QMediaPlayer::MediaStatus status)
{
    if(status == QMediaPlayer::EndOfMedia){
          bool rand = ui->randMusicButton->property("rand").toBool();
          if(rand){
              int totalLine = musicTable->rowCount();
              if(totalLine){
                 int row =  qrand() % totalLine;
                 playTableMusic(musicTable,row);
              }
          }
    }
​
    return;
}
​
void CloudMusicWindow::on_randMusicButton_clicked()
{
    bool rand = ui->randMusicButton->property("rand").toBool();
    if(rand){
        ui->randMusicButton->setProperty("rand","false");
    }else{
        ui->randMusicButton->setProperty("rand","true");
    }
    ui->randMusicButton->style()->unpolish(ui->randMusicButton);
    ui->randMusicButton->style()->polish(ui->randMusicButton);
    ui->randMusicButton->update();
​
    return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值