2017-02-12 2 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 Я думаю !?

Или просто сохраните указатель на QMediaPlayer в своем классе для последующего использования.

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