这篇主要是介绍如何使用ListView的自定义高亮委托和自定义元素委托,以及section属性的分类和section的自定义委托。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| import QtQuick 2.7 import QtQuick.Controls 2.5
Rectangle { id:root ScrollView{ id:scroll anchors.fill: parent ScrollBar.horizontal.policy: ScrollBar.AlwaysOff ScrollBar.vertical.policy: ScrollBar.AlwaysOn ListModel{ id:listModel ListElement{ section:qsTr("推荐") title:qsTr("发现音乐") image:"qrc:/Images/music.png" } ListElement{ section:qsTr("推荐") title:qsTr("私人FM") image:"qrc:/Images/FM.png" } ListElement{ section:qsTr("推荐") title:qsTr("视频") image:"qrc:/Images/video.png" } ListElement{ section:qsTr("推荐") title:qsTr("朋友") image:"qrc:/Images/friends.png" } ListElement{ section:qsTr("我的音乐") title:qsTr("本地音乐") image:"qrc:/Images/localmusic.png" } ListElement{ section:qsTr("我的音乐") title:qsTr("下载管理") image:"qrc:/Images/download.png" } ListElement{ section:qsTr("我的音乐") title:qsTr("我的音乐云盘") image:"qrc:/Images/cloud.png" } ListElement{ section:qsTr("我的音乐") title:qsTr("我的收藏") image:"qrc:/Images/collection.png" } } Component { id: sectionHeading Rectangle { width: listView.width height: childrenRect.height
Text { text: section font.italic: true font.pixelSize: 15 } } } ListView { id:listView clip: true model: listModel anchors.fill: parent focus: true highlight: Rectangle { color: "lightsteelblue" width:listView.width height:30 Behavior on y{ NumberAnimation { duration: 10000 } } } highlightFollowsCurrentItem :true delegate: Item { id:delegateitem width: listView.width height: 30 Image { id: icon source: image anchors.left: parent.left anchors.leftMargin: 20 anchors.verticalCenter: parent.verticalCenter width: 16 height: 16
} Text { id: text text: title anchors.left: icon.right anchors.leftMargin: 20 anchors.verticalCenter: parent.verticalCenter } MouseArea{ anchors.fill: parent onClicked: { listView.currentIndex = index;
} } } section.property: "section" section.criteria: ViewSection.FullString section.delegate: sectionHeading
} }
}
|
ListView的clip属性是裁剪,避免item在拖动的过程中超出边界,highlight就是高亮item,可以自定义。默认高亮item的高度和宽度会自动适应Item的高和宽。highlightFollowsCurrentItem属性是控制高亮item是否根据currentItem的切换自动改变坐标和高宽和item一致。delegate就是item的委托,这个委托的最上层不能使用Rectangle,这样会和高亮的Item冲突,导致高亮无法显示。使用Item作为最顶层的元素就没有这个问题。Item的委托在点击的过程中不会自动更新视图的currentIndex索引,需要手动处理。section作为对item的分类,property是关联modelData中分类的属性,delegate指定代理。