前言

对于开发用户界面,最重要的一方面是保持数据与可视化的分离。例如,一个电话簿可以使用一个垂直文本链表排列或者使用一个网格联系人图片排列。在这两种情况中,数据都是相同的,但是可视化效果却是不同的。这种方法通常被称作模型-视图模式。在这种模式中,数据通常被称作模型,可视化处理称作视图。

在QtQuick中,数据通过模型-视图分离。对于每个视图,每个数据元素的可视化都分给一个代理。QtQuick附带了一组预定义的模型与视图。想要使用这个系统,必须理解这些类,并且知道如何创建合适的代理来获得正确的显示和交互。

基础模型

最基础的分离数据与显示的方法是使用Repeater元素。它被用于实例化一组元素项,并且很容易与一个用于填充用户界面的定位器相结合。

举个简单的例子,下面的例子中,一个repeater元素创建了10个子项,子项的数量由model属性控制。对于每个子项Rectangle包含了一个Text元素,你可以将text属性设置为index的值,因此可以看到子项的编号是0~9。

import QtQuick 2.3import QtQuick.Window 2.2Window {    id: root    visible: true    width: 640    height: 480    Column {        spacing: 2        Repeater {            model: 10            Rectangle {                width: 100                height: 40                radius: 3                color: "lightblue"                Text {                    anchors.centerIn: parent                    text: index                }            }        }    }}

运行效果如下:

上面的示例是一个不错的编号列表,有时我们想显示一些更复杂的数据的话,使用一个JavaScript序列来替换整型变量model的值可以达到我们的目的。序列可以使用任何类型的内容,可以是字符串,整数,或者对象。在下面的例子中,使用了一个字符串链表。我们仍然使用index的值作为变量,并且我们也访问modelData中包含的每个元素的数据。

import QtQuick 2.3import QtQuick.Window 2.2Window {    id: root    visible: true    width: 640    height: 480    Column {        spacing: 2        Repeater {            model: ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]            Rectangle {                width: 100                height: 40                radius: 3                color: "lightblue"                Text {                    anchors.centerIn: parent                    text: index + ":" + modelData                }            }        }    }}

运行效果如下:

将数据暴露成一组序列,你可以通过标号迅速的找到你需要的信息。这是一个最简单的模型,也是经常会用到的ListModel(l链表模型)。一个链表模型由许多ListElement(链表元素)组成。在每个链表元素中,可以绑定值在属性上。例如在下面这个例子中,每个元素都提供了一个名字和一个颜色。

import QtQuick 2.3import QtQuick.Window 2.2Window {    id: root    visible: true    width: 640    height: 480    Column {        spacing: 2        Repeater {            model: ListModel {                ListElement { name: "水星"; surfaceColor: "gray" }                ListElement { name: "金星"; surfaceColor: "yellow" }                ListElement { name: "地星"; surfaceColor: "blue" }                ListElement { name: "火星"; surfaceColor: "orange" }                ListElement { name: "木星"; surfaceColor: "orange" }                ListElement { name: "土星"; surfaceColor: "yellow" }                ListElement { name: "天星"; surfaceColor: "lightblue" }                ListElement { name: "海王星"; surfaceColor: "lightblue" }            }            Rectangle {                width: 100                height: 40                radius: 3                color: "lightblue"                Text {                    anchors.centerIn: parent                    text: name                }                Rectangle {                    anchors.left: parent.left                    anchors.verticalCenter: parent.verticalCenter                    anchors.leftMargin: 2                    width: 16                    height: 16                    radius: 8                    border.color: "black"                    border.width: 1                    color: surfaceColor                }            }        }    }}

运行效果如下:

上面的例子中,每个元素的属性绑定连接到repeater实例化的子项上。这意味着变量name和surfaceColor可以被repeater创建的每个Rectangle和Text项引用。这不仅可以方便的访问数据,也可以使源代码更加容易阅读。surfaceColor是名字左边的圆的颜色。

repeater内容的每个子项实例化时绑定了默认的代理。这意味着上面第一个例子中的代码和下面的代码是相同的。注意,唯一不同的是delegate属性名,我们将会在后面详细讲解。

import QtQuick 2.3import QtQuick.Window 2.2Window {    id: root    visible: true    width: 640    height: 480    Column {        spacing: 2        Repeater {            model: 10            delegate: Rectangle {                width: 100                height: 40                radius: 3                color: "lightblue"                Text {                    anchors.centerIn: parent                    text: index                }            }        }    }}

cmenu 隐藏子项中的一个子项_QML中的模型-视图-代理相关推荐

  1. linux强制移除pdf密码,分享|如何在 Linux 中从一个 PDF 文件中移除密码

    今天,我碰巧分享一个受密码保护的 PDF 文件给我的一个朋友.我知道这个 PDF 文件的密码,但是我不想透露密码.作为代替,我只想移除密码并发送文件给他.我开始在因特网上查找一些简单的方法来从 PDF ...

  2. cmenu 隐藏子项中的一个子项_区分Maven中dependencyManagement与dependencies的作用

    导读:使用maven是为了更好的帮项目管理包依赖,maven的核心就是pom.xml.而maven中有许多的标签,下面我们主要讨论parent.dependencies与dependencyManag ...

  3. java中定义一个时间_Java中的日期和时间

    根据个人目前正在编写的<Java核心编程-基础篇>的规划,这部分属于第15章内容,这里沿用了书中的章节编号.另外,因为原文篇幅太长,这里适当做了删减. 15.1.概述 在 Java 8 之 ...

  4. python画笑脸图案-如何让这些代码中的一个在窗口中绘制不同大小的笑脸?

    我在这里忽略了一些重要的标准,即在一个窗口中显示不同大小的笑脸.我在这方面是新手,我不知道如何独自完成这项工作.这是迄今为止我创建并失败的两个代码.有人能告诉我我缺少什么来完成这个计划吗?在 项目1: ...

  5. r语言 rgl 强制过程中_一个R语言中操纵矢量空间数据的标准化工具—sf

    ​注: 本文是R语言sf包的核心开发者和维护者--来自德国明斯特大学的地理信息学教授:Edzer Pebesma 的一篇关于sf包的简介,发表于2018年7月的R语言期刊,主要讲述了sf的定位.功能. ...

  6. EOS project 中 的一个 jsp 文件中 调用 javascript函数的问题

    大家好! 在我的 EOS 项目中,有一个页面流,共三个元素:"开始"---"视图"----"结束".其中视图与一个jsp文件(A.jsp)关 ...

  7. java去除字符串中最后一个字符_java中字符串如何去除最后一个字符方法

    java中字符串如何去除最后一个字符方法. 方法有很多.不过如果只是个测试,那哪种都可以. 最简单易懂的方法 利用substring()与length() String str = "abc ...

  8. php中遍历一个数组,php中遍历数组的方法

    PHP中遍历数组有三种常用的方法: 一.使用for语句循环遍历数组: 二.使用foreach语句遍历数组: 三.联合使用list().each()和while循环遍历数组. 这三种方法中效率最高的是使 ...

  9. Linux中从一个目录路径中获取文件名

    比如有一个变量 /usr/SMARTMapReduce/script/MYGOLD 这样一个值, 如何从里面取出最后的MYGOLD呢? 我也是刚开始学习Linux,按自己的学习,提供两种方法 第一种方 ...

最新文章

  1. 如何在CPU上优化GEMM(下)
  2. android源代码居中字体,Android (布局优化) TextView实现drawable图标大小 位置与第一行文本居中...
  3. 解决java.lang.UnsupportedClassVersionError: Bad version number in .class file问题
  4. conlleval_[转载]CRF++的使用总结
  5. python快速排序解析_快速排序python实现总结
  6. 袋鼯麻麻——智能购物平台
  7. vue_cli全局变量使用
  8. 模拟电子技术不挂科学习笔记3(放大电路的分析方法)
  9. 从VMware的vCenter中读取事件
  10. 台式机尺寸相关信息整理
  11. strings.Builder 源码阅读与分析
  12. 验证错误信息jquery validation
  13. 【NAS】群晖使用自带DDNS实现外网访问
  14. TCP UDP之网络编程及数据库入门
  15. html设置手写输入,手写登陆页面
  16. 在飞书群里设置机器人提醒 github 代码更新
  17. 软件工程——软件危机
  18. 23 《武士道》 -豆瓣评分7.8
  19. python爬虫——爬取豆瓣热门电影海报生成html文件
  20. 自动驾驶汽车未来展望

热门文章

  1. C/Cpp / STL / vector 的 erase 会造成当前位置和之后的迭代器失效的疑问
  2. ESP32-S3与ESP32-S2相比,有什么不同呢?
  3. layer.open子页面调用父页面的方法_记好这 24 个 ES6 方法,用来解决实际开发的 JS 问题...
  4. html中div不在火狐居中,Firefox嵌套CSS中div标签居中问题解决方法
  5. django gunicorn 各worker class简单性能测试
  6. Luogu T9376 区间GCD
  7. 应用开发之WinForm开发
  8. php ob静态缓存
  9. 【转】让itunes下载加速的真正办法,转向至香港台湾澳门苹果服务器 -- 不错不错!!!...
  10. [hdu5203]计数水题