Bootstrap

QT 音乐播放器

利用三个信号槽实现进度条,播放时间,总时间显示

//监听播放进度的改变
connect(mediaPlayer, &QMediaPlayer::positionChanged,
        this, &Widget::updatePosition);

//监听播放时长的改变
connect(mediaPlayer, &QMediaPlayer::durationChanged,
        this, &Widget::updateDuration);

//监听进度条拖动
connect(ui->play_progress_hs, &QSlider::sliderMoved,
        this, &Widget::setPosition);

代码详解

  • positionChanged:当媒体播放进度(位置)发生变化时,QMediaPlayer发出此信号,连接到Widget类的updatePosition槽函数。
  • durationChanged:当媒体的总时长发生变化时,QMediaPlayer发出此信号,连接到Widget类的updateDuration槽函数。
  • sliderMoved:当用户拖动进度条时,QSlider发出此信号,连接到Widget类的setPosition槽函数。
  • 
    void Widget::updatePosition(qint64 position)
    {
        //position为时间偏移量
        ui->play_progress_hs->setValue(position);
        
        QTime currentTime(0,
                         (position / 60000) % 60,
                         (position / 1000 ) % 60
                         );
        ui->playback_duration_l->setText(currentTime.toString("mm:ss"));
    }
    
    void Widget::updateDuration(qint64 duration)
    {
        //播放时设置歌曲总时长
        ui->play_progress_hs->setRange(0, duration);
    
        QTime totalTime(0,
                        (duration / 60000) % 60,
                        (duration / 1000 ) % 60
                        );
        ui->total_duration_l->setText(totalTime.toString("mm:ss"));
    }
    
    void Widget::setPosition(int position)
    {
        mediaPlayer->setPosition(position);
    }

    QSlider 的长度和 position

    QSlider 的长度在视觉上表示进度条的长度,它不会直接影响 position,但它的最大值和最小值需要与 positionduration 相匹配,以便准确反映播放进度。

    positionduration

  • position:表示当前播放的位置,以毫秒为单位。
  • duration:表示媒体的总时长,以毫秒为单位。

QSlider 的长度(即其范围)不会直接影响播放的 position(位置)和 duration(时长),但它们需要同步来显示和控制媒体播放的位置和总时长。

1.当媒体的总时长发生变化时,updateDuration 函数会被调用。此函数执行以下操作:

  • 设置进度条范围ui->play_progress_hs->setRange(0, duration);

    • 将进度条的最小值设为 0,最大值设为媒体的总时长 duration。这样,进度条的范围与媒体播放时间同步,确保进度条的值能够精确反映播放进度。
  • 格式化总时长QTime totalTime(0, (duration / 60000) % 60, (duration / 1000 ) % 60 );

    • 将总时长 duration 转换为分钟和秒钟格式。duration / 60000 将毫秒转换为分钟,(duration / 1000 ) % 60 将毫秒转换为秒钟并取余60,确保秒钟在0到59之间。
  • 更新总时长标签ui->total_duration_l->setText(totalTime.toString("mm:ss"));

    • 将格式化后的时间字符串设置为总时长标签的文本,更新界面显示。

2.当媒体播放位置发生变化时,updatePosition 函数会被调用。此函数执行以下操作:

  1. 设置进度条值ui->play_progress_hs->setValue(position);

    • 将进度条的值设置为当前播放位置 position,使进度条的滑块反映当前的播放位置。
  2. 格式化当前播放时间QTime currentTime(0, (position / 60000) % 60, (position / 1000 ) % 60 );

    • 将当前播放位置 position 转换为分钟和秒钟格式。position / 60000 将毫秒转换为分钟,(position / 1000 ) % 60 将毫秒转换为秒钟并取余60,确保秒钟在0到59之间。
  3. 更新当前播放时间标签ui->playback_duration_l->setText(currentTime.toString("mm:ss"));

    • 将格式化后的时间字符串设置为当前播放时间标签的文本,更新界面显示。

3.当用户拖动进度条时,setPosition 函数会被调用。此函数执行以下操作:

  1. 设置媒体播放器的播放位置mediaPlayer->setPosition(position);
    • 将媒体播放器的播放位置设置为用户拖动进度条后的位置 position。这样,用户可以通过拖动进度条来控制播放进度。

视觉效果和功能同步

尽管 QSlider 的长度(即视觉上的长度)不会直接影响 positionduration,但其最大值和最小值需要与媒体的总时长和当前播放位置同步,以便准确反映和控制播放进度。这种同步确保了进度条的滑块位置能够精确反映媒体的当前播放进度,并且用户可以通过拖动滑块来控制播放位置。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;