高级用法(Advanced Techniques)

10.5.1 实现一个播放列表(Implementing a Playlist)

Qt 5 multimedia接口没有提供播放列表。幸好,它非常容易实现。通过设置模型子项与MediaPlayer元素可以实现它,如下所示。当playstate通过player控制时,Playlist元素负责设置MediaPlayer的source。

  1. Playlist {
  2. id: playlist
  3. mediaPlayer: player
  4. items: ListModel {
  5. ListElement { source: "trailer_400p.ogg" }
  6. ListElement { source: "trailer_400p.ogg" }
  7. ListElement { source: "trailer_400p.ogg" }
  8. }
  9. }
  10. MediaPlayer {
  11. id: player
  12. }

Playlist元素的第一部分如下,注意使用setIndex函数来设置source元素的索引值。我们也实现了next与previous函数来操作链表。

  1. Item {
  2. id: root
  3. property int index: 0
  4. property MediaPlayer mediaPlayer
  5. property ListModel items: ListModel {}
  6. function setIndex(i)
  7. {
  8. console.log("setting index to: " + i);
  9. index = i;
  10. if (index < 0 || index >= items.count)
  11. {
  12. index = -1;
  13. mediaPlayer.source = "";
  14. }
  15. else
  16. mediaPlayer.source = items.get(index).source;
  17. }
  18. function next()
  19. {
  20. setIndex(index + 1);
  21. }
  22. function previous()
  23. {
  24. setIndex(index + 1);
  25. }

让播放列表自动播放下一个元素的诀窍是使用MediaPlayer的status属性。当得到MediaPlayer.EndOfMedia状态时,索引值增加,恢复播放,或者当列表达到最后时,停止播放。

  1. Connections {
  2. target: root.mediaPlayer
  3. onStopped: {
  4. if (root.mediaPlayer.status == MediaPlayer.EndOfMedia)
  5. {
  6. root.next();
  7. if (root.index == -1)
  8. root.mediaPlayer.stop();
  9. else
  10. root.mediaPlayer.play();
  11. }
  12. }
  13. }