QML 模型(ListModel)

news2024/11/29 0:37:30

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();   // 更新列表
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/402100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 进程间通信机制(一) IPC概念和模型

一. 前言 一直想把Binder机制认识清楚, 但是它涉及Android系统的Framework, Native, kernel层, 就需要你要有 C C基础阅读底层源码的能力, 目前笔者的水平,对Binder 在Native 和kernel层的实现原理和机制也是懵逼状态, 真的是博大精深, 故现阶段先把看懂和理解清楚的整理出来…

内核链表分析

内核链表 文章目录内核链表list_head创建链表添加节点1. list_add2. list_add_tail 接口删除节点宿主结构1.找出宿主结构 list_entry(ptr, type, member)2 container_of3. 宿主结构的遍历list_head 在 Linux 内核中,提供了一个用来创建双向循环链表的结构 list_hea…

海康摄像头使用RTSP

1.协议格式。海康威视IP摄像头rtsp协议地址如下:rtsp://[username]:[passwd][ip]:[port]/[codec]/[channel]/[subtype]/av_stream主码流:rtsp://admin:12345192.168.1.64:554/h264/ch1/main/av_streamrtsp://admin:12345192.168.1.64:554/MPEG-4/ch1/mai…

SpringCloud微服务保护

微服务保护微服务保护1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.超时处理1.1.3.仓壁模式1.1.4.断路器1.1.5.限流1.1.6.总结1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel1.4.微服务整合Sentinel2.流量控制2.1.簇点链路2.1.…

java基础学习 day51 (匿名内部类)

1. 什么是匿名内部类? 隐藏了名字的内部类,实际名字为:外部类名$序号可以写在成员位置,为没有名字的成员内部类也可以写在局部位置,为没有名字的局部内部类 2. 匿名内部类的格式? new 类名/接口名() { 重…

深入理解AQS

概念设计初衷:该类利用 状态队列 实现了一个同步器,更多的是提供一些模板方法(子类必须重写,不然会抛错)。 设计功能:独占、共享模式两个核心,state、Queue2.1 statesetState、compareAndSetSta…

SpringMVC简单仿写

之前我分享过SpringMVC的基本原理与配置(原文链接:https://blog.csdn.net/L170311/article/details/129339120),为了更深层次的学习,精益求精,手动仿写了一个MVC原理实现demo,一起学习一下吧 结构目录&…

使用预训练模型自动续写文本的四种方法

作者:皮皮雷 来源:投稿 编辑:学姐 这篇文章以中文通用领域文本生成为例,介绍四种常用的模型调用方法。在中文文本生成领域,huggingface上主要有以下比较热门的pytorch-based预训练模型: 本文用到了其中的ue…

RFID在技术在工业产线上的应用

RFID在技术在工业产线上的应用一工业产线需求制造业生产线几乎每月都要损耗大量物料,并且生产结果与预期因为有误差而影响交货的情况时有发生,生产线也往往因人为原因造成种种误差。将RFID标签贴在生产物料或产品上,可自动记录产品的数量、规…

学完Java只能在互联网公司任职吗?

当然不是只有互联网公司需要软件,需要开发技术人员,传统行业、新经济领域都有软件项目需求;Java也不是只能做网站、企业应用,还可以用于嵌入式、游戏…… 互联网时代的手机、智能电视、家具、机械设备等各种有形产品都将会嵌入智…

二、Neo4j源码研究系列 - 单步调试

二、Neo4j源码研究系列 - 单步调试 一、背景介绍 上一篇我们已经把了neo4j的源码准备以及打包流程完成了,本篇将讲解如何对neo4j进行单步调试。对于不了解如何编译打包neo4j的读者,请阅读《一、Neo4j源码研究系列 - 源代码准备》。 大纲: …

【改机教程】iOS系统去除小黑条,改拍照声、拨号音、键盘音,不用越狱,支持所有机型

大家好,上次给大家分享了几个iOS系统免越狱改机教程 今天带来最新的教程,这次修改利用的是同一个漏洞,由外网大神 tamago 开发,国内大神冷风 进行汉化和优化 可以修改的地方包括 去除底部小黑条 dock栏透明 桌面文件夹透明 桌面…

golang 占位符还傻傻分不清?

xdm ,写 C/C 语言的时候有格式控制符,例如 %s , %d , %c , %p 等等 在写 golang 的时候,也是有对应的格式控制符,也叫做占位符,写这个占位符,需要有对应的数据与之对应,不能瞎搞 基本常见常用…

Cobalt Strike---(2)

数据管理 Cobalt Strike 的团队服务器是行动期间Cobalt Strike 收集的所有信息的中间商。Cobalt Strike 解析来 自它的 Beacon payload 的输出,提取出目标、服务和凭据。 如果你想导出 Cobalt Strike 的数据,通过 Reporting → Export Data 。Cobalt Str…

CentOS7自签SSL证书并配置nginx

一、生成SSL证书 1、安装依赖包 yum install -y openssl openssl-devel 2、生成私钥,会让你输入一个 4~2048 位的密码,你需要暂时记住这个密码 openssl genrsa -des3 -out server.key 2048 输入两遍相同的密码 3、生成CSR(Certificate Signing Request …

Postgresql-12.5 visual studio-2022 windows 添加pg工程并调试

pg内核学习,记录一下 文章目录安装包编译安装VS添加Postgresql工程调试源码安装包 (1)perl下载 https://www.perl.org/get.html (2)diff下载 http://gnuwin32.sourceforge.net/packages/diffutils.htm (…

23届非科班选手秋招转码指南

1.秋招情况介绍 1.1自我介绍 我是一名23届非科班转码选手,本硕均就读于某211院校机械专业,秋招共计拿下12份offer,包括大疆创新、海康威视、联发科技、理想汽车、中电28、阳光电源等各行业、各种性质企业的意向。主要的投递岗位为嵌入式软件…

若依微服务版在定时任务里面跨模块调用服务

第一步 在被调用的模块中添加代理 RemoteTaskFallbackFactory.java: package com.ruoyi.rpa.api.factory;import com.ruoyi.common.core.domain.R; import com.ruoyi.rpa.api.RemoteTaskService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springf…

【springmvc】执行流程

SpringMVC执行流程 原理图 1、SpringMVC常用组件 DispatcherServlet:前端控制器,不需要工程师开发,由框架提供 作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求 HandlerMa…

Windows7,10使用:Vagrant+VirtualBox 安装 centos7

一、Vagrant,VirtualBox 是什么二、版本说明1、win7下建议安装版本2、win10下建议安装版本三、Windows7下安装1、安装Vagrant2、安装VirtualBox3、打开VirtualBox,配置虚拟机默认安装地址四、windows7下载.box文件,安装centos 71、下载一个.b…