ListView(headerView,footerView)


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 = " "
                }
            }


        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值