qml ListView 列表视图

ListView 列表视图

在QML(Qt Modeling Language)中,ListView元素用于显示列表数据。

它可以绑定到一个模型,并根据模型中的数据自动生成多个项。

以下是一个简单的示例,展示如何在QML中使用ListView:

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: "ListView Example"

    // 定义一个ListModel,包含一些水果名称
    ListModel {
        id: fruitModel
        ListElement { name: "Apple"; color: "red" }
        ListElement { name: "Banana"; color: "yellow" }
        ListElement { name: "Cherry"; color: "red" }
        ListElement { name: "Date"; color: "brown" }
        ListElement { name: "Grape"; color: "purple" }
        ListElement { name: "Lemon"; color: "yellow" }
        ListElement { name: "Orange"; color: "orange" }
        ListElement { name: "Peach"; color: "pink" }
    }

    // 使用ListView显示ListModel中的数据
    ListView {
        anchors.fill: parent
        model: fruitModel
        delegate: Rectangle {
            width: parent.width
            height: 60
            color: model.color
            border.color: "gray"
            border.width: 1
            radius: 5

            Text {
                anchors.centerIn: parent
                text: model.name
                font.pixelSize: 18
                color: "white"
            }

            MouseArea {
                anchors.fill: parent
                onClicked: {
                    console.log("Clicked on", model.name)
                }
            }
        }

        // 添加滚动条
        ScrollBar.vertical: ScrollBar {
            policy: ScrollBar.AsNeeded
        }
    }
}

示例

import QtQuick 2.15
import QtQuick.Controls 2.15

// 主应用程序窗口
ApplicationWindow {
    visible: true  // 设置窗口可见
    width: 640     // 设置窗口宽度
    height: 480    // 设置窗口高度
    title: "ListModel Example"  // 设置窗口标题

    // 定义一个ListModel,包含一些水果名称和颜色
    ListModel {
        id: fruitModel  // 模型的唯一标识
        ListElement { name: "Apple"; color: "red" }
        ListElement { name: "Banana"; color: "yellow" }
        ListElement { name: "Cherry"; color: "red" }
        ListElement { name: "Date"; color: "brown" }
        ListElement { name: "Grape"; color: "purple" }
        ListElement { name: "Lemon"; color: "yellow" }
        ListElement { name: "Orange"; color: "orange" }
        ListElement { name: "Peach"; color: "pink" }
    }

    // 使用ListView显示ListModel中的数据
    ListView {
        id: fruitListView  // 为ListView添加一个唯一标识
        anchors.fill: parent  // 将ListView填充到父窗口
        model: fruitModel  // 设置ListView的数据模型为fruitModel
        spacing: 10  // 设置水果之间的间距
        currentIndex: 0  // 默认选择第一个项


        delegate: Rectangle {  // 定义每个列表项的委托
            width: parent.width  // 设置矩形的宽度与父元素相同
            height: 60  // 设置矩形的高度
            color: index === fruitListView.currentIndex ? "lightgray" : model.color  // 根据选中状态设置背景颜色
            border.color: "gray"  // 设置矩形的边框颜色
            border.width: 1  // 设置矩形的边框宽度
            radius: 5  // 设置矩形的圆角半径

            // 在矩形中显示水果名称
            Text {
                anchors.centerIn: parent  // 将文本居中对齐在父矩形中
                text: model.name  // 设置文本内容为水果名称
                font.pixelSize: 18  // 设置文本的字体大小
                color: "white"  // 设置文本颜色
            }

            // 定义一个MouseArea,用于处理点击事件
            MouseArea {
                anchors.fill: parent  // 填充父元素
                onClicked: {
                    console.log("Clicked on", model.name,"当前索引", index)  // 输出点击的水果名称
                    fruitListView.currentIndex = index  // 更新当前选中的索引
                }
            }
        }

        // 添加滚动条
        ScrollBar.vertical: ScrollBar {
            policy: ScrollBar.AsNeeded  // 根据需要显示滚动条
        }
    }

    // 添加按钮来动态添加和删除ListModel中的元素
    Button {
        anchors.bottom: parent.bottom  // 将按钮底部对齐到父窗口的底部
        anchors.horizontalCenter: parent.horizontalCenter  // 将按钮水平居中对齐在父窗口中
        text: "Add Fruit"  // 设置按钮显示的文本
        onClicked: {
            fruitModel.append({ name: "New Fruit", color: "green" })  // 向ListModel中添加一个新的水果
        }
    }

    Button {
        anchors.bottom: parent.bottom  // 将按钮底部对齐到父窗口的底部
        anchors.right: parent.right  // 将按钮右侧对齐到父窗口的右侧
        text: "Remove Fruit"  // 设置按钮显示的文本
        onClicked: {
            if (fruitModel.count > 0) {  // 如果ListModel中有元素
                fruitModel.remove(fruitModel.count - 1)  // 移除最后一个元素
                if (fruitListView.currentIndex >= fruitModel.count) {
                    fruitListView.currentIndex = fruitModel.count - 1  // 确保当前索引不超过模型的大小
                }
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可能只会写BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值