找回密码
 立即注册
收起左侧

文件夹方式显示音乐播放列表

3
回复
6927
查看
[复制链接]
累计签到:138 天
连续签到:1 天
来源: 2015-3-31 10:29:51 显示全部楼层 |阅读模式
5Qter豆
RT,这是一个多级列表,每一级有若干文件夹和歌曲,点击文件夹会进入下一级列表。我想把这个树状数据结构写在一个XML文件中,然后使用XmlListModel加载这个文件,再使用ListView显示XmlListModel中的数据。
但是具体应该怎么组织数据,怎么查询XML文件还不是很清楚。另外,除了这种方法还有别的更好的方法吗?

最佳答案

查看完整内容

XmlListModel 虽然简单易用,但是功能有限,每次只能读一层同级别的数据。 我自己就有一个算法是用XmlListModel一层层读xml数据并写进一个json,然后qml操作这个json就方便多了。 代码给你参考一下
回复

使用道具 举报

尚未签到

2015-3-31 10:29:52 显示全部楼层
XmlListModel 虽然简单易用,但是功能有限,每次只能读一层同级别的数据。

我自己就有一个算法是用XmlListModel一层层读xml数据并写进一个json,然后qml操作这个json就方便多了。

代码给你参考一下
  1. Item {
  2.     id: opmlParser

  3.     property string opmlPath: ""

  4.     signal parseFinished(var opml)

  5.     XmlListModel {
  6.         id: modelOpml
  7.         property string subTitle

  8.         property var opmlObj
  9.         property int currentRootsIndex: 0
  10.         property int allRootsCount: 0

  11.         function getAllRootObj() {
  12.             var rootObjs = new Array
  13.             // push all root objects to array
  14.             for (var i=0; i<modelOpml.count; i++) {
  15.                 rootObjs.push(
  16.                             //modelOpml.get(i)
  17.                             {
  18.                                 "text": modelOpml.get(i).text
  19.                                 ,"title": modelOpml.get(i).title
  20.                                 ,"xmlUrl": modelOpml.get(i).xmlUrl
  21.                                 ,"htmlUrl": modelOpml.get(i).htmlUrl
  22.                                 ,"isSelected": false
  23.                             }
  24.                             )
  25.             }
  26.             opmlObj = rootObjs
  27.             // set first subTitle
  28.             subTitle = rootObjs[currentRootsIndex].text
  29.         }

  30.         function getChildObjsFromOneRoot() {
  31.             var rootObjs = opmlObj
  32.             var array = new Array
  33.             for (var i=0; i<modelOpml.count; i++) {
  34. //                rootObjs[currentRootsIndex].children.push(
  35.                 if (modelOpml.get(i).xmlUrl != "") {
  36.                     array.push(
  37.                                 {
  38.                                     "text": modelOpml.get(i).text
  39.                                     ,"title": modelOpml.get(i).title
  40.                                     ,"xmlUrl": modelOpml.get(i).xmlUrl
  41.                                     ,"htmlUrl": modelOpml.get(i).htmlUrl
  42.                                     ,"isSelected": false
  43.                                 }
  44.                                 )
  45.                 }
  46.             }
  47.             rootObjs[currentRootsIndex].children = array
  48.             opmlObj = rootObjs
  49.             // if not end of the roots, set next subTitle
  50.             if (currentRootsIndex < (allRootsCount - 1)) {
  51.                 currentRootsIndex ++
  52.                 subTitle = rootObjs[currentRootsIndex].text
  53.             }
  54.             // else send finish signal
  55.             else {
  56.                 console.log("children objs: ", JSON.stringify(opmlObj))
  57.                 parseFinished(opmlObj)
  58.             }
  59.         }

  60.         onStatusChanged: {
  61.             console.log("model status:", status)
  62.             if (status == XmlListModel.Ready) {
  63.                 if (!subTitle) {
  64.                     allRootsCount = count
  65.                     // get all root object
  66.                     getAllRootObj()
  67.                 }
  68.                 else {
  69.                     // load children object one by one
  70. //                    console.log("children objs: ", JSON.stringify(opmlObj))
  71. //                    console.log("model count: ", count)
  72.                     getChildObjsFromOneRoot()
  73.                 }
  74.             }
  75.             else if (status == XmlListModel.Error) {
  76.                 console.log("XmlListModel.Error: ", errorString())
  77.             }
  78.         }

  79.         query: subTitle ? "/opml/body/outline[@text='" + subTitle + "']/outline": "/opml/body/outline"
  80.         //        query: "/opml/body/outline"
  81.         source:   opmlPath

  82.         XmlRole { name: 'text'; query: '@text/string()' }
  83.         XmlRole { name: 'title'; query: '@title/string()' }
  84.         XmlRole { name: 'type'; query: '@type/string()' }
  85.         XmlRole { name: 'xmlUrl'; query: '@xmlUrl/string()' }
  86.         XmlRole { name: 'htmlUrl'; query: '@htmlUrl/string()' }
  87.     }
  88. }
复制代码

点评

非常感谢,这个代码可以作为参考  详情 回复 发表于 2015-4-1 16:55
回复

使用道具 举报

累计签到:1497 天
连续签到:1 天
2015-3-31 12:17:28 显示全部楼层
用ListView,然后把Delegate设计成和树状图一样的加载方式
回复

使用道具 举报

累计签到:138 天
连续签到:1 天
2015-4-1 16:55:58 显示全部楼层
Joey_Chan 发表于 2015-3-31 17:55
XmlListModel 虽然简单易用,但是功能有限,每次只能读一层同级别的数据。

我自己就有一个算法是用XmlList ...

非常感谢,这个代码可以作为参考
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了