Qt 学习之路 2(84):Repeater
前面的章节我 们介绍过模型视图。这是一种数据和显示相分离的技术,在 Qt 中有着非常重要的地位。在 QtQuick 中,数据和显示的分离同样也是利用这种“模型-视图”技术实现的。对于每一个视图,数据元素的可视化显示交给代理完成。与 Qt/C++ 类似,QtQuick 提供了一系列预定义的模型和视图。本章开始,我们着重介绍这部分内容。这部分内容主要来自http://qmlbook.org/ch06/index.html,在此表示感谢。
由于 QtQuick 中的模型视图的基本概念同前面的章节没有本质的区别,所以这里不再赘述这部分内容。
将数据从表现层分离的最基本方法是使用Repeater
元素。Repeater
元素可以用于显示一个数组的数据,并且可以很方便地在用户界面进行定位。Repeater
的模型范围很广:从一个整型到网络数据,均可作为其数据模型。
Repeater
最简单的用法是将一个整数作为其model
属性的值。这个整型代表Repeater
所使用的模型中的数据个数。例如下面的代码中,model: 10
代表Repeater
的模型有 10 个数据项。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import QtQuick 2.2
Column {
spacing: 2
Repeater {
model: 10
Rectangle {
width: 100
height: 20
radius: 3
color: "lightBlue"
Text {
anchors.centerIn: parent
text: index
}
}
}
}
|
现在我们设置了 10 个数据项,然后定义一个Rectangle
进行显示。每一个Rectangle
的宽度和高度分别为 100px 和 20px,并且有圆角和浅蓝色背景。Rectangle
中有一个Text
元素为其子元素,Text
文本值为当前项的索引。代码运行结果如下:
虽然指定模型项的个数很简单,但实际用处不大。Repeater
还支持更复杂的方式,例如,把一个 JavaScript 数组作为模型。JavaScript 数组元素可以是任意类型:字符串、数字或对象。在下面的例子中,我们将一个字符串数组作为Repeater
的模型。我们当然可以使用index
获得当前索引,同时,我们也可以使用modelData
访问到数组中的每一个元素的值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import QtQuick 2.2
Column {
spacing: 2
Repeater {
model: ["Enterprise", "Colombia", "Challenger", "Discovery", "Endeavour", "Atlantis"]
Rectangle {
width: 100
height: 20
radius: 3
color: "lightBlue"
Text {
anchors.centerIn: parent
text: index +": "+modelData
}
}
}
}
|
代码运行结果如下:
由于能够使用 JavaScript 数组作为Repeater
的模型,而 JavaScript 数组能够以对象作为其元素类型,因而Repeater
就可以处理复杂的数据项,比如带有属性的对象。这种情况其实更为常见。相比普通的 JavaScript 对象,更常用的是ListElement
类型。类似普通 JavaScript 对象,每一个ListElement
可以有任意属性。例如下面的代码示例中,每一个数据项都有一个名字和外观颜色。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import QtQuick 2.2
Column {
spacing: 2
Repeater {
model: ListModel {
ListElement { name: "Mercury"; surfaceColor: "gray" }
ListElement { name: "Venus"; surfaceColor: "yellow" }
ListElement { name: "Earth"; surfaceColor: "blue" }
ListElement { name: "Mars"; surfaceColor: "orange" }
ListElement { name: "Jupiter"; surfaceColor: "orange" }
ListElement { name: "Saturn"; surfaceColor: "yellow" }
ListElement { name: "Uranus"; surfaceColor: "lightBlue" }
ListElement { name: "Neptune"; surfaceColor: "lightBlue" }
}
Rectangle {
width: 100
height: 20
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
}
}
}
}
|
运行结果如下图所示:
ListElement
的每个属性都被Repeater
绑定到实例化的显示项。正如上面代码中显示的那样,这意味着每一个用于显示数据的Rectangle
作用域内都可以访问到ListElement
的name
和surfaceColor
属性。
像上面几段代码中,Repeater
的每一个数据项都使用一个Rectangle
渲染。事实上,这是由于Repeater
具有一个delegate
的默认属性,由于Rectangle
没有显式赋值给任何一个属性,因此它直接成为默认属性delegate
的值,所以才会使用Rectangle
渲染。理解了这一点,我们就可以写出具有显式赋值的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import QtQuick 2.2
Column {
spacing: 2
Repeater {
model: 10
delegate: Rectangle {
width: 100
height: 20
radius: 3
color: "lightBlue"
Text {
anchors.centerIn: parent
text: index
}
}
}
}
|
实际上,这段代码与前面提到的是等价的。
转载于:https://www.cnblogs.com/senior-engineer/p/5628859.html
Qt 学习之路 2(84):Repeater相关推荐
- 《Qt 学习之路 2》
Home / Qt 学习之路 2 / <Qt 学习之路 2>目录 <Qt 学习之路 2>目录 序 Qt 前言 Hello, world! 信号槽 自定义信号槽 Qt 模块简介 ...
- 转载: Qt 学习之路 2归档
Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/
- 对QT学习之路12-14的源代码补充与修正
QT学习之路12-14的源代码有些不完整,为了更好的让大家学习,本人做了一点修正与补充,谢谢.源代码如下: 头文件: #ifndef MAINWINDOW_H #define MAINWINDOW_H ...
- java qt gui_工控编程,Qt 学习之路
原标题:工控编程,Qt 学习之路 Qt 是一个著名的 C++ 库--或许并不能说这只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI.使用 Qt,在一定程序上你获得的是一个"一站 ...
- Qt学习之路_12(简易数据管理系统)
原文地址为: Qt学习之路_12(简易数据管理系统) 前言 最近从大陆来到台湾,之间杂事很多,挤不出时间来更新博客- 这次主要是通过做一个简易的数据库管理系统,来学习在Qt中对数据库,xml,界面的各 ...
- QT学习之路2 学习笔记
QT学习之路2 学习笔记 1.Qt 是一个著名的 C++ 应用程序框架.你并不能说它只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个&quo ...
- QT学习之路(一)ubuntu 18.04的Qt Creator在线安装
文章目录 前言 一.准备工作 二.安装步骤 参考链接 前言 Qt是嵌入式开发的必备工具之一,在Linux下安装尤其重要. Qt是C++的一个库,或者说是开发框架,里面集成了一些库函数,提高开发效率. ...
- Qt学习之路(24): QPainter(改写paintEvent)
Qt学习之路(24): QPainter(改写paintEvent) 多些大家对我的支持啊!有朋友也提出,前面的几节有关event的教程缺少例子.因为event比较难做例子,也就没有去写,只是把大概写 ...
- [记录]学习QT学习之路2第四天
今天学习内容对应<<QT学习之路2>>第18到23部分,主要是有关于QT事件这一部分的内容(=_=真是看到我快吐了,感觉这本书不适合我这种初学者). 先放出思维导图 难点总结 ...
- [记录]QT学习之路2学习第三天
今天的内容对应的是<<QT学习之路2>>第13到17部分. 主要内容由思维导图总结 一,什么是QT对话框 二,什么是QT标准对话框 三,怎么样实现QT对话框数据传递 四,深入了 ...
最新文章
- python官网下载好慢1001python官网下载好慢-Python|时间复杂度测试
- form 中Enctype=multipart/form-data 的作用
- 查看ORACLE 下所有信息
- ExtJS中的Grid分页
- 如何用c语言倒序输出字母,菜鸟求助-如何用指针法将一串字符按单词的倒序输出?如:i love yo...
- 可以这样给DataGrid加个序号列。
- 如何在NEO区块链上实现信息加密
- 前端向后台发送请求有几种方式?
- 通过binlog恢复mysql数据库
- html消除样式,清除css样式
- 手机远程控制电脑方法(TeamViewer vs 向日葵)
- 串口通信协议c语言程序,串口通信协议源代码.doc
- HTML导航如何加下划线,HTML怎么设置下划线?html文字加下划线方法
- 为wpf中的DataGrid控件添加鼠标单击事件
- matlab中abs是什么函数,abs是什么函数(excel表格abs公式)
- 在线PS照片处理工具 无需下载怎么编辑图片
- 怎样编配吉他独奏曲(上)
- 数字逻辑电路 逻辑运算 与、或、非、与非、或非、与或非、异或、同或 二进制运算技巧
- 右键文件夹一直转圈圈怎么办
- ubuntu16.04编译obmc