2017-02-12 354 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