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

それはあまり意味がありません - それが住んでいるクラスの中でそれをインスタンス化しなければなりません。これは、QMediaPlayer特有のものよりもC++のオブジェクトライフサイクルを誤解している大きな問題のようです。 – 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

関連する問題