QML 模型(ListModel)

LIstModel(列表模型)

ListModel 是ListElement定义的简单容器,每个定义都包含数据角色。内容可以在 QML 中动态定义或显式定义。

属性:

count模型中数据条目的数量
dynamic动态角色,默认情况下,角色的类型在首次使用角色时是固定的

方法:

append()添加新项到模型末尾
clear()从模型中删除所有内容
get(int index)返回列表模型中索引处的项。这允许从 JavaScript 访问或修改项目数据:
insert()将新项添加到位于位置索引的列表模型中,并将值置于字典
move()将 n 个项目从一个位置移动到另一个位置
remove()从模型中删除索引处的内容
set()更改列表模型中索引处的
setProperty()修改指定位置的属性
sync()从工作线程脚本修改列表模型后,将任何未保存的更改写入列表模型。

在列表容器中添加列表项:

ListElement添加的规则:

  1. 必须以小写字母开头,并且对于给定模型中的所有元素都应通用
  2. 值必须是简单的常量;字符串
  3. 布尔值(真、假)、数字或枚举值
ListModel{
        id:model1
        ListElement{    //使用ListElement添加列表数据项
            name:"1111"
            age:"12"
        }
        ListElement{
            name:"2222"
            age:"13"
        }
    }

使用ListView显示:

使用ListView获取ListModel通过delegate(委托)来选择格式来显示数据

ListModel{
        id:model1
        ListElement{
            name:"1111"
            age:"12"
        }
        ListElement{
            name:"2222"
            age:"13"
        }
    }
    ListView{
        anchors.fill: parent
        model: model1
        delegate:  Row{
            Text{text:"名字:"+name}
            Text{text:"年龄:"+age}
        }
    }

 使用Component(组键)包装,用来显示信息:

Window {
    id:window1
    visible: true
    width: 700
    height: 700
    title: qsTr("Hello World")
    ListModel{
        id:model1
        ListElement{
            name:"1111"
            age:"12"
        }
        ListElement{
            name:"2222"
            age:"13"
        }

    }
    
    Component{
        id:component1
        Row{
            spacing: 10
            Text{text:"名字:"+name}
            Text{text:"年龄:"+age}
        }
    }
    
    ListView{
        anchors.fill: parent
        model: model1
        delegate: component1  //设置委托
    }
}

在ListElement中嵌套ListElement的处理:

 ListModel {
        id: fruitModel
        ListElement {
            name: "小明"
            age: 13
            attributes: [
                ListElement { description: "学生" },
                ListElement { description: "学习委员" }
            ]
        }
        ListElement {
            name: "王老师"
            age: 30
            attributes: [
                ListElement { description: "班主任" }
            ]
        }
        ListElement {
            name: "张三"
            age: 13
            attributes: [
                ListElement { description: "学生" },
                ListElement { description: "体育委员" }
            ]
        }
    }
    Component {
        id: fruitDelegate
        Item {
            width: 200; height: 50
            Text { id: nameField; text: name }
            Text { text: ':' + age; anchors.left: nameField.right }
            Row {
                anchors.top: nameField.bottom
                spacing: 5
                Text { text: "身份" }
                Repeater {
                    model: attributes
                    Text { text: description }
                }
            }
        }
    }
    ListView{
        anchors.fill: parent
        model:fruitModel
        delegate: fruitDelegate
    }

 

 函数的使用:


ListModel{
        id:model1
        ListElement{
            name:"1111"
            age:"12"
        }
        ListElement{
            name:"2222"
            age:"13"
        }
    }

//输出列表项的个数
Component.onCompleted: {
        console.log("列表项的个数",Model.count)
    }
//添加数据到尾部
Component.onCompleted: {
        model1.append({"name":3333,"age":13})
    }
//插入数据
Component.onCompleted: {
        model1.insert(1,{"name":4444,"age":13})
    }
//获取数据
 Component.onCompleted: {
        var data=model1.get(1).name;
        model1.get(1).name="5555"
        model1.get(1).age="15"
        
    }
//移动数据
Component.oncompleted:{
        model1.move(0,model1.count-3,3);//前 3 项移动到列表末尾
    }
//删除数据
Component.oncompleted:{
        model1.remove(2);//删除索引处的内容
    }
//清空
Component.oncompleted:{
        model1.clear();//清空
    }
//修改索引处的值
Component.oncompleted:{
        model1.set(1,{"name":3222,"age":13})
    }
//设置索引处的属性
Component.oncompleted:{
        model1.setProperty(1,"name","12222")
    }

 列表模型和WorkerScript的使用

listModel可以和WorkerScript一起使用,可以从多线程访问列表,可以将列表操作移动到其他线程以避免阻塞主 GUI 线程。

定时添加数据:

        Timer {  //定时器
            id: timer
            interval: 2000; repeat: true
            running: true
            triggeredOnStart: true

            onTriggered: { //定时器触发
                var msg = {'action': 'appendCurrentTime', 'model': listModel};
                worker.sendMessage(msg);
            }
        }


WorkerScript.onMessage = function(msg) {
    if (msg.action == 'appendCurrentTime') {
        var data = {'time': new Date().toTimeString()};
        msg.model.append(data); //添加数据
        msg.model.sync();   // 更新列表
    }
}

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值