在“StackView具体解释(1)”中,我们学习了StackView的基本使用方法,这次呢,我们来讲delegate的定制、被管理的View的生命周期、查找View等主题。

本文还会用到“StackView具体解释(1)”中的演示样例,如有须要能够回头看看。

附加属性

首先看看StackView提供的附加属性 Stack(后面会用到):

  • Stack.index,index代表当前Item在StackView里的索引,从0開始哦,和StackView.depth不同哦,depth从1開始。
  • Stack.status。这是一个枚举值,代表当前Item的状态。

  • Stack.view,指向当前Item所属的StackView实例

我们能够在StackView管理的Item里直接訪问附加属性。后面会有演示样例。

查找View

StackView有一个find方法:find(func, onlySearchLoadedItems)。

这种方法让我们提供一个比較函数,它会对StackView管理的页面应用指定的func函数,当func返回true时,就觉得找到了须要的View,find()会返回这个View。第二个參数onlySearchLoadedItems为true时,说明仅仅查找载入到内存中的Item。为false时,则查找全部Item。

来看一个简单的样例。基于之前的样例改动的。改动的地方我做了标注。

  1. import QtQuick 2.4
  2. import QtQuick.Controls 1.3
  3. import QtQuick.Window 2.2
  4. Window {
  5. title: "StackViewDemo";
  6. width: 480;
  7. height: 320;
  8. visible: true;
  9. StackView {
  10. id: stack;
  11. anchors.fill: parent;
  12. /*
  13. onBusyChanged: {
  14. console.log("busy - " + stack.busy);
  15. }
  16. */
  17. Text {
  18. text: "Click to create first page";
  19. font.pointSize: 14;
  20. font.bold: true;
  21. color: "blue";
  22. anchors.centerIn: parent;
  23. MouseArea {
  24. anchors.fill: parent;
  25. onClicked: if(stack.depth == 0)stack.push(page);
  26. }
  27. }
  28. }
  29. Component {
  30. id: page;
  31. Rectangle {
  32. color: Qt.rgba(stack.depth*0.1, stack.depth*0.2, stack.depth*0.3);
  33. property alias text: txt.text; //property alias
  34. Text {
  35. id: txt; //new code
  36. anchors.centerIn: parent;
  37. font.pointSize: 24;
  38. font.bold: true;
  39. color: stack.depth <= 4 ? Qt.lighter(parent.color) : Qt.darker(parent.color);
  40. //在onCompleted中为text属性赋值
  41. //避免属性绑定,方便查找。
  42. Component.onCompleted: {
  43. text = "depth - " + stack.depth;
  44. }
  45. }
  46. Button {
  47. id: next;
  48. anchors.right: parent.right;
  49. anchors.bottom: parent.bottom;
  50. anchors.margins: 8;
  51. text: "Next";
  52. width: 70;
  53. height: 30;
  54. onClicked: {
  55. if(stack.depth < 8) stack.push(page);
  56. }
  57. }
  58. Button {
  59. id: back;
  60. anchors.right: next.left;
  61. anchors.top: next.top;
  62. anchors.rightMargin: 8;
  63. text: "Back";
  64. width: 70;
  65. height: 30;
  66. onClicked: {
  67. if(stack.depth > 0) stack.pop();
  68. }
  69. }
  70. Button {
  71. id: home;
  72. anchors.right: back.left;
  73. anchors.top: next.top;
  74. anchors.rightMargin: 8;
  75. text: "Home";
  76. width: 70;
  77. height: 30;
  78. onClicked: {
  79. if(stack.depth > 0)stack.pop(stack.initialItem);
  80. }
  81. }
  82. Button {
  83. id: clear;
  84. anchors.right: home.left;
  85. anchors.top: next.top;
  86. anchors.rightMargin: 8;
  87. text: "Clear";
  88. width: 70;
  89. height: 30;
  90. onClicked: {
  91. if(stack.depth > 0)stack.clear();
  92. }
  93. }
  94. //new code
  95. Button {
  96. id: popTo3;
  97. anchors.right: clear.left;
  98. anchors.top: next.top;
  99. anchors.rightMargin: 8;
  100. text: "PopTo3";
  101. width: 70;
  102. height: 30;
  103. onClicked: {
  104. var resultItem = stack.find(
  105. function(item){
  106. console.log(item.text);
  107. return item.text === "depth - 3" ? true : false;
  108. }
  109. );
  110. if(resultItem !== null)stack.pop(resultItem);
  111. }
  112. }
  113. }
  114. }
  115. }

我给id为page的组件。加入了一个PopTo3的button,点击它,会退栈。直到栈的深度为3。

find()方法查找时的顺序。是从栈顶到栈底。

假设找不到,则返回null。假设调用pop(null),则会直接退到栈底,即栈深度为1。所以我在代码里做了推断,假设find返回null,就不调用pop。

代码里另一些变化,为了方便通过文本查找,我给page的Rectangle加入了一个属性别名。指向它内部的Text对象的text属性。

事实上假设使用StackView的get(index)方法,PopTo3的onClicked信号处理器还能够重写成以下的样子:

  1. onClicked: {
  2. var resultItem = stack.get(2);
  3. if(resultItem !== null)
posted @
2017-07-10 15:52 
yangykaifa 
阅读(...) 
评论(...) 
编辑 
收藏

Qt Quick之StackView具体解释(2)的更多相关文章

  1. Qt Quick之StackView具体解释(1)

    Qt Quick中有个StackView.我在<Qt Quick核心编程>一书中没有讲到.近期有人问起,趁机学习了一下,把它的基本使用方法记录下来. 我准备分两次来讲.第一次讲主要的使用方 ...

  2. Qt Quick 之 PathView 具体解释

    PathView ,顾名思义,沿着特定的路径显示 Model 内的数据. Model 能够是 QML 内建的 ListModel . XmlListModel ,也能够是在 C++ 中实现的 QAbs ...

  3. Qt Quick实现的涂鸦程序

    之前一直以为 Qt Quick 里 Canvas 才干够自绘.后来发觉不是,原来还有好几种方式都能够画图! 能够使用原始的 OpenGL(Qt Quick 使用 OpenGL 渲染).能够构造QSGN ...

  4. Qt Quick综合实例之文件查看器

    假设你基于Qt SDK 5.3.1来创建一个Qt Quick App项目,项目模板为你准备的main.qml文档的根元素是ApplicationWindow或Window.这次我们就以Applicat ...

  5. Qt on Android: Qt Quick 之 Hello World 图文具体解释

    在上一篇文章,<Qt on Android:QML 语言基础>中,我们介绍了 QML 语言的语法,在最后我们遗留了一些问题没有展开,这篇呢,我们就正式開始撰写 Qt Quick 程序,而那 ...

  6. Qt Quick 组件和动态创建的对象具体的解释

    在<Qt Quick 事件处理之信号与槽>一文中介绍自己定义信号时,举了一个简单的样例.定义了一个颜色选择组件,当用户在组建内点击鼠标时,该组件会发出一个携带颜色值的信号,当时我使用 Co ...

  7. Qt Quick 之 QML 与 C++ 混合编程具体解释

    Qt Quick 技术的引入.使得你能够高速构建 UI ,具有动画.各种绚丽效果的 UI 都不在话下.但它不是万能的.也有非常多局限性,原来 Qt 的一些技术,比方低阶的网络编程如 QTcpSocke ...

  8. Qt 学习之路 :Qt Quick Controls

    自 QML 第一次发布已经过去一年多的时间,但在企业应用领域,QML 一直没有能够占据一定地位.很大一部分原因是,QML 缺少一些在企业应用中亟需的组件,比如按钮.菜单等.虽然移动领域,这些组件已经变 ...

  9. Qt Quick 事件处理之信号与槽

    前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本的语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经能够完毕 ...

随机推荐

  1. vuec常用插件

    1.  实现下拉刷新和下拉加载效果 iscroll-probe.js 2.手势密码插件 patternLock.js 3.实现复制 clipboard.min.js

  2. 怎么在在php配置文件中打开php_fileinfo扩展

    运行composer下载文件时的相关报错截图 处理方法: 在php配置文件中打开php_fileinfo扩展 你需要在查看是否有这个扩展包, 如果有, 那就在php.ini写 extension=ph ...

  3. python 读取文件生成嵌套列表

    def read_data(file_name): if not re.findall(".txt", file_name): file_name += ".txt&qu ...

  4. oracle获取排序后的第一条信息

    查询表table1里字段id小于10的所有数据,并且让数据根据id降序排列,然后得到第一条数据 select * from (select * from table1 where id<10 o ...

  5. BZOJ 2502 Luogu P4843 清理雪道 最小流

    题意: 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机 ...

  6. ERC20 Token

    pragma solidity ^0.4.8; contract Token{ // token总量,默认会为public变量生成一个getter函数接口,名称为totalSupply(). uint ...

  7. java IO流 内容整理

    在java中,对数据的输入和输出操作以流的方式进行.(注:对文件的操作用io.File类,但不能对文件中的内容进行操作) 一.IO流的分类: 按数据流的方向不同,可以分为输入流和输出流: 按处理数据的 ...

  8. Win2008 Server MySql安装包详细安装教程

    首先去官网下载 下载MySql 下载地址:http://downloads.mysql.com/archives/community/ 我这里选择MSI的32位安装包安装,服务器系统32位的. 安装M ...

  9. centOS7+mariadb+Nginx+PHP7.0 安装

    1.前期准备工作 更新 yum 源,自带的源没有 PHP5.6 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7 ...

  10. Python中的列表(3)

    我们创建的列表元素的顺序是无法预测的,因为我们无法控制用户提供数据的顺序. 为了组织列表中的元素,所以Python帮我们提供一些方法用来排序列表中的元素. 1.方法 sort() 可以对列表永久性排序 ...