利用三个信号槽实现进度条,播放时间,总时间显示
//监听播放进度的改变
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
,但它的最大值和最小值需要与position
和duration
相匹配,以便准确反映播放进度。position
和duration
position
:表示当前播放的位置,以毫秒为单位。duration
:表示媒体的总时长,以毫秒为单位。
QSlider
的长度(即其范围)不会直接影响播放的 position
(位置)和 duration
(时长),但它们需要同步来显示和控制媒体播放的位置和总时长。
1.当媒体的总时长发生变化时,updateDuration
函数会被调用。此函数执行以下操作:
-
设置进度条范围:
ui->play_progress_hs->setRange(0, duration);
- 将进度条的最小值设为 0,最大值设为媒体的总时长
duration
。这样,进度条的范围与媒体播放时间同步,确保进度条的值能够精确反映播放进度。
- 将进度条的最小值设为 0,最大值设为媒体的总时长
-
格式化总时长:
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
函数会被调用。此函数执行以下操作:
-
设置进度条值:
ui->play_progress_hs->setValue(position);
- 将进度条的值设置为当前播放位置
position
,使进度条的滑块反映当前的播放位置。
- 将进度条的值设置为当前播放位置
-
格式化当前播放时间:
QTime currentTime(0, (position / 60000) % 60, (position / 1000 ) % 60 );
- 将当前播放位置
position
转换为分钟和秒钟格式。position / 60000
将毫秒转换为分钟,(position / 1000 ) % 60
将毫秒转换为秒钟并取余60,确保秒钟在0到59之间。
- 将当前播放位置
-
更新当前播放时间标签:
ui->playback_duration_l->setText(currentTime.toString("mm:ss"));
- 将格式化后的时间字符串设置为当前播放时间标签的文本,更新界面显示。
3.当用户拖动进度条时,setPosition
函数会被调用。此函数执行以下操作:
- 设置媒体播放器的播放位置:
mediaPlayer->setPosition(position);
- 将媒体播放器的播放位置设置为用户拖动进度条后的位置
position
。这样,用户可以通过拖动进度条来控制播放进度。
- 将媒体播放器的播放位置设置为用户拖动进度条后的位置
视觉效果和功能同步
尽管 QSlider
的长度(即视觉上的长度)不会直接影响 position
和 duration
,但其最大值和最小值需要与媒体的总时长和当前播放位置同步,以便准确反映和控制播放进度。这种同步确保了进度条的滑块位置能够精确反映媒体的当前播放进度,并且用户可以通过拖动滑块来控制播放位置。