調用 setMedia() 後立即讀取 duration() 返回 0。文檔說明:"The value may change across the life time of the QMediaPlayer object and may not be available when initial playback begins."
void MainWindow::slotPlayAudio(const QString &audioFilePath) {
currentAudioFilePath_ = audioFilePath;
player_->setMedia(QUrl::fromLocalFile(audioFilePath));
player_->setVolume(50);
horizontalSliderMusic->setMinimum(0);
horizontalSliderMusic->setMaximum(player_->duration()); // 這裡返回 0!
player_->play();
pushButtonPlay->setText("pause");
}
connect(player_, &QMediaPlayer::durationChanged, [this](qint64 duration) {
horizontalSliderMusic->setMaximum(duration);
});
connect(player_, &QMediaPlayer::positionChanged, [this](qint64 position) {
if (player_->duration() != horizontalSliderMusic->maximum()) {
horizontalSliderMusic->setMaximum(player_->duration());
}
horizontalSliderMusic->setValue(position);
});
durationChangedpositionChanged 中檢查並同步 maximum,應對 duration 遲到或變化mediaStatusChanged → LoadingMedia → LoadedMediadurationChanged (可能多次,最終值為準)positionChanged 開始周期性發出