Qt Quick - StackView

news2024/11/13 3:50:55

StackView 使用总结

  • 一、概述
  • 二、在应用中使用StackView
  • 三、基本的导航
    • 1. push Item
    • 2. pop Item
    • 3. replace Item
  • 四、深度链接
  • 五、寻找Item
  • 六、转换
  • 六、Item的所有权
  • 七、大小

一、概述

StackView可以与一组相互链接的信息页面一起使用。例如,电子邮件应用程序具有单独的视图,以列出最新的电子邮件,查看特定的电子邮件和列表/查看附件。当用户打开电子邮件时,电子邮件列表视图被压入栈中,当用户选择返回时,电子邮件列表视图又被弹出。

下面的代码片段展示了一个简单的用例,点击相关的按钮,mainView被推入栈中,然后弹出栈中:

 ApplicationWindow {
      title: qsTr("Hello World")
      width: 640
      height: 480
      visible: true

      StackView {
          id: stack
          initialItem: mainView
          anchors.fill: parent
      }

      Component {
          id: mainView

          Row {
              spacing: 10

              Button {
                  text: "Push"
                  onClicked: stack.push(mainView)
              }
              Button {
                  text: "Pop"
                  enabled: stack.depth > 1
                  onClicked: stack.pop()

              }
              Text {
                  text: stack.depth
              }
          }
      }
  }

二、在应用中使用StackView

在应用程序中使用StackView非常简单,只需将其作为子窗口添加即可。栈通常锚定在窗口的边缘,除了顶部或底部,它可能锚定在状态栏或其他类似的UI组件上。然后可以通过调用栈的导航方法来使用栈。StackView中显示的第一个元素是赋值给initialItem的元素,如果没有设置initialItem,则是最顶层的元素。

三、基本的导航

StackView支持三种主要的导航操作:push()、pop()和replace()。这些操作与经典的栈操作类似,“push”操作将一个元素添加到栈顶,“pop”操作将栈顶的元素删除,而“replace”操作类似于先弹出后推操作,即用新元素替换最上面的元素。栈中最顶层的元素对应于屏幕上当前可见的元素。从逻辑上讲,“push”在应用UI中是向前或更深入的,“pop”是向后导航,而“replace”则是替换当前内容。

1. push Item

在下面的动画中,使用push()函数将三个标签控件压入栈视图:

栈现在包含以下元素:[A, B, C]。
注意:当栈为空时,push()操作将不会有过渡动画,因为没有任何过渡(通常在应用程序启动时)。
在这里插入图片描述

2. pop Item

继续上面的例子,调用pop()方法删除栈中最顶层的元素:

在这里插入图片描述

栈现在包含以下元素:[A, B]。

注意:对于深度为1或0的栈,pop()操作什么都不会做。在这种情况下,可以使用clear()方法清空栈。

有时,需要返回栈中的多个步骤。例如,返回到应用程序中的“主”项或某种节项。在这种情况下,可以为pop()指定一个元素项作为参数。这称为“unwind”操作,栈将展开,直到指定的元素为止。如果没有找到元素项,stack展开直到只剩下一个元素项,这个元素项就是当前元素。要显式回退到栈的底部,建议使用pop(null),尽管任何不存在的元素都可以。
在下面的动画中,我们通过调用pop(null)将栈unwind到第一个元素:

栈现在只包含一个元素:[a]。
在这里插入图片描述

3. replace Item

在下面的动画中,我们将最上面的元素替换为D:
在这里插入图片描述

栈现在包含以下元素:[A, B, D]。

四、深度链接

深度链接意味着将应用程序启动到特定状态。例如,可以启动报纸应用程序,绕过最上面的条目,显示特定的文章。就StackView而言,深度链接意味着能够修改栈的状态,以至于可以将一组项目推到栈的顶部,或将栈完全重置为给定状态。

StackView中用于深度链接的API与用于基本导航的API相同。压入一个数组而不是一个元素,会将数组中的所有元素都添加到栈中。然而,过渡动画只应用于数组中的最后一项。push()的一般语义适用于深度链接,也就是说,它添加压入栈的任何内容。
注意:只加载数组的最后一项。剩下的元素只在需要的时候加载,或者在后续调用pop时加载,或者在使用get()获取元素时加载。
给定栈[A, B, C],结果如下:

  • push([D, E, F]) => [A, B, C, D, E, F] - "push"过渡动画
  • replace([D, E, F]) => [A, B, D, E, F] - “replace” C和F之间的过渡动画
  • clear()后面跟着push([D, E, F]) => [D, E, F]:当栈为空时,没有推送元素的过渡动画。

五、寻找Item

调用find()可以找到应用程序没有引用的项。这个方法需要一个回调函数,对栈中的每一项调用(从栈顶开始),直到找到匹配的项为止。如果回调函数返回true, find()将停止查找并返回匹配的项,否则返回null。

下面的代码在堆栈中搜索名为“order_id”的项并展开到该项。

 stackView.pop(stackView.find(function(item) {
      return item.name == "order_id";
  }));

你也可以使用get(index)获取栈中的一个元素。

 previousItem = stackView.get(myItem.StackView.index - 1));

六、转换

对于每个push或pop操作,在进入和退出元素时会应用不同的过渡动画。这些动画定义了进入元素的动画方式,以及退出元素的动画方式。我们可以通过为StackView的pushEnter、pushExit、popEnter、popExit、replaceEnter和replaceExit属性指定不同的过渡来定制动画。

注意:过渡动画会影响彼此的过渡行为。为其中一个定制动画而留下另一个可能会得到意想不到的结果。
下面的代码片段为push和pop操作定义了一个简单的渐隐过渡:

StackView {
      id: stackview
      anchors.fill: parent

      pushEnter: Transition {
          PropertyAnimation {
              property: "opacity"
              from: 0
              to:1
              duration: 200
          }
      }
      pushExit: Transition {
          PropertyAnimation {
              property: "opacity"
              from: 1
              to:0
              duration: 200
          }
      }
      popEnter: Transition {
          PropertyAnimation {
              property: "opacity"
              from: 0
              to:1
              duration: 200
          }
      }
      popExit: Transition {
          PropertyAnimation {
              property: "opacity"
              from: 1
              to:0
              duration: 200
          }
      }
  }

注意:不支持在添加到StackView的项目上使用锚。通常情况下,push、pop和replace转换会对位置进行动画处理,但这在应用锚点时是不可能实现的。请注意,这只适用于项的根。为它的子元素使用锚点的效果符合预期。

六、Item的所有权

StackView只接受它自己创建的项目的所有权。这意味着任何被压入StackView的item都不会被StackView销毁;只有StackView从组件或url中创建的项目才会被StackView销毁。为了说明这一点,下面示例中的消息只会在StackView被销毁时打印,而不会在项目从堆栈弹出时打印:

 Component {
      id: itemComponent

      Item {
          Component.onDestruction: print("Destroying second item")
      }
  }

  StackView {
      initialItem: Item {
          Component.onDestruction: print("Destroying initial item")
      }

      Component.onCompleted: push(itemComponent.createObject(window))
  }

然而,在下面的例子中,从URL和组件中创建的两个项目都会在它们弹出StackView时被销毁:

  Component {
      id: itemComponent

      Item {
          Component.onDestruction: print("Destroying second item")
      }
  }

  StackView {
      initialItem: "Item1.qml"

      Component.onCompleted: push(itemComponent)
  }

七、大小

StackView不会从压入它的元素中继承隐式的大小。这意味着,例如,将它用作对话框的内容将无法正常工作:

  Dialog {
      StackView {
          initialItem: Rectangle {
              width: 200
              height: 200
              color: "salmon"
          }
      }
  }

有几种方法可以确保StackView在这种情况下有一个大小:

  • 在StackView上设置implicitWidth和implicitHeight。
  • 为矩形设置implicitWidth和implicitHeight。
  • 在对话框上设置contentWidth和contentHeight。
  • 指定对话框的大小。

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

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

相关文章

HTML5 <img> 标签

HTML5 <img> 标签 实例 HTML5 <img>标签用于向网页中添加相关图片。 如何插入图像&#xff1a; <img src"smiley-2.gif" alt"Smiley face" width"42" height"42">尝试一下 &#xff08;更多实例见页面底部&…

基于营销类系统运营活动增长带来的数据库设计演进

一、前言 为了支持业务数据的不断增长&#xff0c;在数据库层面的性能提升主要体现在几个维度&#xff1a;1&#xff09;数据降级&#xff1b;2&#xff09;数据主题分而治之&#xff1b;3&#xff09;实时交易转异步&#xff1b;4&#xff09;硬件扩容&#xff0c;当然网上一…

question

4、Mysql高可用有几种方案&#xff0c;分别有什么特点? 特点优点缺点mysql group replication(MGR)组复制组内一半节点同意即可提交更改操作、最多支持 9 个节点、基于MRG插件、多节点写入支持、故障自动检测、引擎必须为 innodb、必须有主键、binlog 为 row强一致、paxos协议…

Arcgis Engine之打开MXD文档

Arcgis Engine之打开MXD文档概述方法一&#xff1a;方法二&#xff1a;概述 图层加载功能将用到MapControl 控件提供的LoadMxFile 方法。 该方法通过指定的*. Mxd文档路径直接获取 该方法第一个参数是文件路径&#xff0c; 第二个参数是MExd文档中地图的名称或索引&#xff0…

1.初识Earth Engine

Earth Engine平台是一个集科学分析和地理信息可视化的综合性平台&#xff0c;该平台提供丰富的API&#xff0c;以及工具帮助方便查看、计算、处理、分析大范围的各种影像等GIS数据。 基础数据 目前Earth Engine上已由几十PB的影像栅格数据及矢量数据数据地址。数据主要分为以…

Prometheus+Grafana从0到1搭建jvm监控

目 录1. 准备工作2. 添加配置2.1 添加maven依赖2.2 application.properties增加配置2.3 新增配置类2.4 配置Prometheus2.5 配置Grafana3. 小结在上一篇博客《 PrometheusMysqld_exporterGrafana从0到1搭建MySQL的可视化监控》&#xff0c;我们完成了对数据库的可视化监控搭建&a…

都说程序员就是吃青春饭,35岁就会被淘汰,我用自己的经历来告诉你事实

上个假期我回家了&#xff0c;遇到三姑六婆总会问我读研没读、工作怎么样、薪资多少等等问题&#xff0c;相信大家也都遇到过。我一般会用“在做程序员&#xff0c;写代码的这种话”来敷衍他们&#xff0c;但没想到他们懂得还挺多的&#xff0c;又搬出了一套关于程序员的理论&a…

当AI遇上元宇宙:智能科技如何助力虚拟世界的发展?

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;10分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 人工智能和元宇宙是21世纪最突出的技术之一。它们各自可以在许多方面提高人们…

MySQL、PostgreSQL、Oracle、SQL Server数据库触发器实现同步数据

数据库触发器是一种在数据库中设置的程序&#xff0c;当满足某些特定条件时&#xff0c;它会自动执行。触发器通常与数据表的操作&#xff08;例如插入、更新和删除&#xff09;相关联&#xff0c;它们可以帮助保证数据的完整性和一致性。在本篇博客中&#xff0c;我将介绍各种…

对SQL注入进行的一些总结

简介 SQL注入作为一种攻击方式最早可以追溯到20世纪90年代中期&#xff0c;当时Web应用程序开始流行并广泛使用数据库作为其后端数据存储。最早的SQL注入攻击是通过简单地在Web表单输入框中输入SQL代码来实现的&#xff0c;攻击者可以通过修改输入参数来篡改数据库查询的行为&a…

Pytorch 容器 - 2. Module的属性访问 modules(), children(), parameters(), buffers()等

目录 1. modules() 和 named_modules() 2. children() 和 named_children() 3. parameters() 和 named_parameters() 4. buffers() 和 named_buffers() Module类内置了很多函数&#xff0c;其中本文主要介绍常用的属性访问函数&#xff0c;包括&#xff1a; modules(), nam…

Spring事务源码-EnableTransactionManagement实现解析

Transactional注解 Transactional是spring中声明式事务管理的注解配置方式。Transactional注解可以帮助我们标注事务开启、提交、者回滚、事务传播、事务隔离、超时时间等操作。 而EnableTransactionManagement是开启Spring 事务的入口。 EnableTransactionManagement 标注启…

什么是数字人?数字人可以应用在哪些行业?

数字人指的是由计算机技术、人工智能技术和大数据技术等多种技术手段构建的一种虚拟的人类形态。数字人通常具备丰富的信息处理能力、模拟能力和学习能力&#xff0c;可以根据人们的需求进行智能化定制服务。 数字人 在很多行业领域&#xff0c;数字人都被广泛应用&#xff0…

【并发编程】ConcurrentHashMap源码分析(一)

ConcurrentHashMap源码分析CHM的使用CHM的存储结构和实现CHM源码put源码分析initTable 初始化tabletreeifyBin()和tryPresize()transfer 扩容和数据迁移高低位的迁移ConcurrentHashMap是一个高性能的&#xff0c;线程安全的HashMapHashTable线程安全&#xff0c;直接在get,put方…

spring security 的AuthenticationSuccessHandler 没有调用 ,无法生效

今天想不明白&#xff0c;我控制层写了一个登录的接口。结果验证成功了&#xff0c;我发现AuthenticationSuccessHandler 没有调用 &#xff0c;而且也不生效啊&#xff0c;最后研究终于发现是因为我们需要配置登录的url 这个url 我们访问&#xff0c;中间的什么控制器什么的框…

Win10怎么取消开机密码?这样做就可以!

集美们&#xff0c;我每次开电脑都要输入密码&#xff0c;感觉太麻烦了&#xff0c;想把开机密码取消掉&#xff0c;应该怎么做呀&#xff1f;感谢回答&#xff01;】 在Windows 10操作系统中&#xff0c;用户可以设置开机密码来保护计算机的安全性。然而&#xff0c;有时候用…

【CSS】使用绝对定位 / 浮动解决外边距塌陷问题 ( 为父容器 / 子元素设置内边距 / 边框 | 为子元素设置浮动 | 为子元素设置绝对定位 )

文章目录一、外边距塌陷描述1、没有塌陷的情况2、外边距塌陷情况二、传统方法解决外边距塌陷 - 为父容器 / 子元素设置内边距 / 边框三、使用浮动解决外边距塌陷 - 为子元素设置浮动四、使用绝对定位解决外边距塌陷 - 为子元素设置绝对定位一、外边距塌陷描述 在 标准流的父盒子…

AE开发20210601之绘制集合要素、绘制点、空间查询、属性查询、图形查询、选择集内容、符号化

AE开发之绘制集合要素绘制点步骤queryFilterQueryDefcursor查现有的SpatialRel可以有的空间关系有哪一些。Map类&#xff0c;对应的是FeatureSelection属性&#xff0c;SelectionCount属性&#xff0c;空间查询属性查询图形查询选择集内容符号化multiparrcolorRampLineSymbol下…

a标签 链接 target=”_blank” 为什么要增加 rel=”noopener noreferrer”

在<a></a>中使用target"_blank" 那么会得到以下错误提示&#xff1a; Using target"_blank" without rel"noopener noreferrer" is a security risk: see https://mathiasbynens.github.io/rel-noopener [react/jsx-no-target-blank…

Golang流媒体实战之七:hls拉流服务源码阅读

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Golang流媒体实战》系列的第七篇&#xff0c;继续学习一个重要且通用的知识点&#xff1a;hls拉流在《体验开源项目lal》一文中&#xff0…