2017-02-12 92 views
0

我使用此代碼段從Qt文檔在我的應用程序中播放的音頻文件(通知等):如何自動銷燬QMediaPlayer?

QMediaPlayer *player = new QMediaPlayer(); 
player->setMedia(QUrl("qrc:/huggle/sounds/" + file)); 
player->setVolume(100); 
player->play(); 

然而,這在我看來就像它會泄漏,因爲有媒體播放器沒有析構函數。

有沒有辦法在它以非阻塞方式完成播放後將其刪除?可能掛鉤一些事件可行,但目前還不清楚。

+0

爲什麼要在堆上創建它呢? – MrEricSir

+0

@MrEricSir因爲它在一個函數中,如果我在堆棧中定義它,它會在開始播放聲音之前立即銷燬。 play()是異步函數並立即返回,因此該對象在退出創建它的函數時會被銷燬。 – Petr

+0

這沒什麼意義 - 在它所在的類中實例化它,或者如果必須的話,甚至在全局範圍內實例化它。這看起來像是一個更大的問題,在C++中誤解了對象生命週期而不是QMediaPlayer的任何特定事件。 – MrEricSir

回答

0

您可以簡單地使用信號QMediaPlayer::mediaStatusChanged(QMediaPlayer::MediaStatus status)與狀態是QMediaPlayer::EndOfMedia我猜!?

或者只是將指針保存在您的班級中,以備將來使用。

connect(player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), SLOT(player_mediaStatusChanged(QMediaPlayer::MediaStatus))); 


// slot 
void YourClass::player_mediaStatusChanged(QMediaPlayer::MediaStatus status) 
{ 
    if (status == QMediaPlayer::EndOfMedia) 
     sender()->deleteLater(); // will schedule the deletion of your QMediaPlayer (sender of this signal) 
} 
+0

我真的沒有任何後來使用...我可能會做一個計時器,只是檢查一段時間後,並刪除舊指針引用的對象,但這是一個有點醜陋的解決方案:/ – Petr

+0

爲什麼使用計時器,只需安排在QMediaPlayer :: mediaStatusChanged'信號中自動刪除!?我改變我的答案以提供代碼示例。 – xander

+0

如果由於播放問題而未發出此信號,該怎麼辦? – Petr