遇到了一個坑QMediaPlayer::duration的坑.
這個坑是當你setMedia之後, 直接使用duration獲取播放時長會得到0, 出錯時候的代碼片段如下:
void MainWindow::slotPlayAudio(const QString &audioFilePath) { currentAudioFilePath_ = audioFilePath; player_->setMedia(QUrl::fromLocalFile(audioFilePath)); player_->setVolume(50); horizontalSliderMusic->setMinimum(0); horizontalSliderMusic->setMaximum(player_->duration()); //這裡的duration返回是0, 從而導致之後處理進度的時候出錯 player_->play(); pushButtonPlay->setText("pause"); }針對這個問題文檔中對此描述是"The value may change across the life time of the QMediaPlayer object and may not be available when initial playback begins"
要解決這個問題可以在響應durationChanged信號的槽中獲取duration, 這個時候duration是正確的, 如此可以使用諸如下面的代碼進行處理:
connect(player_, &QMediaPlayer::positionChanged, [this](qint64 position){ if(player_->duration() != horizontalSliderMusic->maximum()) { horizontalSliderMusic->setMaximum(player_->duration()); } horizontalSliderMusic->setValue(position); });