ListView 用来显示一个条目列表,条目对应的数据来自于 Model,而每个条目的外观则
由Delegate 决定。我们可以将Delegate 看成如何展示 Item 的一个模板。Android手机上常见
的联系人界面,其实就是使用 ListView 实现的,而且 Android 的 ListView 和 Qt Quick 的
ListView 使用同样的模式:Model、View、Item Template(Delegate)。
要使用 ListView,必须为其指定一个Model、一个Delegate。
Model可以是QML内建类型,如ListModel、XmlListModel,
也可以是在C++中实现的
QAbstractItemModel或QAbstractListModel的派生类。
我们先以Qt Quick 内建Model为例,把使用ListView的方方面面都介绍一下,然后再
看如何使用在C++中实现自定义的Model。
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.1
Window {
visible: true
width: 640
height: 480
title: qsTr("phone tabel")
Rectangle {
anchors.fill: parent
color: "#eeeeee"
Component {
id:phoneDelegate
Item {
id: wrapper
width: parent.width
height: 30
MouseArea {
anchors.fill:parent
onClicked: {
wrapper.ListView.view.currentIndex = index
}
}
RowLayout {
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
spacing: 8
Text {
id: _coll
text: name
color: wrapper.ListView.isCurrentItem?"red":"black"
font.pointSize: wrapper.ListView.isCurrentItem?22:18
Layout.preferredWidth: 200
}
Text {
id: _cost
text: cost
color: wrapper.ListView.isCurrentItem?"red":"black"
font.pointSize: wrapper.ListView.isCurrentItem?22:18
Layout.preferredWidth: 150
}
Text {
id: _manu
text: manu
color: wrapper.ListView.isCurrentItem?"red":"black"
font.pointSize: wrapper.ListView.isCurrentItem?22:18
Layout.fillWidth: true
}
}
}
}
ListView{
id:_listView
anchors.fill: parent
delegate: phoneDelegate
model: ListModel{
ListElement{
name:"iphone 12"
cost:"4545"
manu:"apple"
}
ListElement{
name:"iphone 18"
cost:"4545545"
manu:"apple"
}
ListElement{
name:"iphone 10"
cost:"1200"
manu:"apple"
}
}
focus: true
highlight: Rectangle {
color: "lightblue"
}
}
}
}
headerView:
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.1
Window {
visible: true
width: 640
height: 480
title: qsTr("phone tabel")
Rectangle {
anchors.fill: parent
color: "#eeeeee"
ListModel{
id:phoneModel
ListElement{
name:"iphone 12"
cost:"4545"
manu:"apple"
}
ListElement{
name:"iphone 18"
cost:"4545545"
manu:"apple"
}
ListElement{
name:"iphone 10"
cost:"1200"
manu:"apple"
}
}
Component {
id:phoneDelegate
Item {
id: wrapper
width: parent.width
height: 30
MouseArea {
anchors.fill:parent
onClicked: {
wrapper.ListView.view.currentIndex = index
}
}
RowLayout {
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
spacing: 8
Text {
id: _coll
text: name
color: wrapper.ListView.isCurrentItem?"red":"black"
font.pointSize: wrapper.ListView.isCurrentItem?22:18
Layout.preferredWidth: 200
}
Text {
id: _cost
text: cost
color: wrapper.ListView.isCurrentItem?"red":"black"
font.pointSize: wrapper.ListView.isCurrentItem?22:18
Layout.preferredWidth: 150
}
Text {
id: _manu
text: manu
color: wrapper.ListView.isCurrentItem?"red":"black"
font.pointSize: wrapper.ListView.isCurrentItem?22:18
Layout.fillWidth: true
}
}
}
}
Component {
id:headerView
Item {
width: parent.width
height: 30
MouseArea {
anchors.fill:parent
onClicked: {
wrapper.ListView.view.currentIndex = index
}
}
RowLayout {
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
spacing: 8
Text {
text: "name"
font.bold: true
font.pointSize: 20
Layout.preferredWidth: 200
}
Text {
text: "cost"
font.bold: true
font.pointSize: 20
Layout.preferredWidth: 150
}
Text {
text: "manu"
font.bold: true
font.pointSize: 20
Layout.fillWidth: true
}
}
}
}
ListView{
id:_listView
anchors.fill: parent
delegate: phoneDelegate
model: phoneModel
header: headerView
focus: true
highlight: Rectangle {
color: "lightblue"
}
}
}
}
footerView:
import QtQuick 2.2
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.1
import QtQml 2.14
Window {
visible: true
width: 640
height: 480
title: qsTr("phone tabel")
Rectangle {
anchors.fill: parent
color: "#eeeeee"
ListModel{
id:phoneModel
ListElement{
name:"iphone 12"
cost:"4545"
manu:"apple"
}
ListElement{
name:"iphone 18"
cost:"4545545"
manu:"apple"
}
ListElement{
name:"iphone 10"
cost:"1200"
manu:"apple"
}
}
Component {
id:footerView
Text {
width: parent.width
height: 30
font.italic: true
color: "blue"
verticalAlignment: Text.AlignVCenter
}
}
Component {
id:phoneDelegate
Item {
id: wrapper
width: parent.width
height: 30
MouseArea {
anchors.fill:parent
onClicked: {
wrapper.ListView.view.currentIndex = index
}
}
RowLayout {
anchors.left: parent.left
// anchors.centerIn: parent
anchors.verticalCenter: parent.verticalCenter
spacing: 8
Text {
id: _coll
text: name
color: wrapper.ListView.isCurrentItem?"red":"black"
font.pointSize: wrapper.ListView.isCurrentItem?22:18
Layout.preferredWidth: 200
}
Text {
id: _cost
text: cost
color: wrapper.ListView.isCurrentItem?"red":"black"
font.pointSize: wrapper.ListView.isCurrentItem?22:18
Layout.preferredWidth: 150
}
Text {
id: _manu
text: manu
color: wrapper.ListView.isCurrentItem?"red":"black"
font.pointSize: wrapper.ListView.isCurrentItem?22:18
Layout.fillWidth: true
}
}
}
}
Component {
id:headerView
Item {
width: parent.width
height: 30
RowLayout {
anchors.left: parent.left
// anchors.centerIn: parent
anchors.verticalCenter: parent.verticalCenter
spacing: 8
Text {
text: "name"
font.bold: true
font.pointSize: 20
Layout.preferredWidth: 200
}
Text {
text: "cost"
font.bold: true
font.pointSize: 20
Layout.preferredWidth: 150
}
Text {
text: "manu"
font.bold: true
font.pointSize: 20
Layout.fillWidth: true
}
}
}
}
ListView{
id:_listView
anchors.fill: parent
delegate: phoneDelegate
model: phoneModel
header: headerView
footer: footerView
focus: true
highlight: Rectangle {
color: "lightblue"
}
onCurrentIndexChanged:{
if( _listView.currentIndex >=0 ){
var data = _listView.model.get(_listView.currentIndex);
_listView.footerItem.text = data.name + "," + data.cost + "," + data.manu
}else{
_listView.footerItem.text = " "
}
}
}
}
}