当前位置: 首页 > news >正文

【Qt Quick】状态:State 使用

State 是 Qt Quick 中管理界面组件状态的关键工具。它允许我们定义组件的不同状态,并且在用户交互或事件发生时进行状态切换,从而实现属性、外观和行为的动态变化。通过使用 State,可以避免复杂的条件逻辑,使代码更加简洁和可维护。

在本教程中,我们将详细讲解如何使用 StatePropertyChangeswhenTransition 实现组件状态的切换。通过一个完整的示例,您将学习如何响应用户交互事件、如何自动化状态转换,以及如何为状态切换添加动画。

创建一个示例:矩形的状态切换

我们从一个简单的例子开始,通过 Rectangle 的颜色和形状来展示状态的切换效果。

创建基础矩形

首先,我们创建一个矩形,它的初始颜色为红色,并放置在窗口中央:

import QtQuick 2.15
import QtQuick.Window 2.15Window {visible: truewidth: 640height: 480title: "State 示例"Rectangle {id: rect1width: 100height: 100color: "red"anchors.centerIn: parent}
}

定义状态 (State)

使用 states 定义状态

为了实现矩形在不同状态下属性的变化,我们需要在 states 属性中定义状态。每个 State 都包含 namePropertyChanges,用来指定状态下组件的属性变化。

Rectangle {id: rect1width: 100height: 100color: "red"anchors.centerIn: parentstates: [State {name: "hovered"PropertyChanges {target: rect1color: "green"}},State {name: "clicked"PropertyChanges {target: rect1color: "blue"scale: 1.5}}]
}

在这个例子中:

  • 当矩形处于 "hovered" 状态时,颜色变为绿色。
  • 当矩形处于 "clicked" 状态时,颜色变为蓝色并放大 1.5 倍。

使用 MouseArea 进行状态切换

为了实现用户交互,使用 MouseArea 来捕获点击和悬停事件并触发状态切换。

MouseArea {id: mouseAreaanchors.fill: parenthoverEnabled: trueonClicked: {rect1.state = (rect1.state === "clicked") ? "" : "clicked";}onEntered: {rect1.state = "hovered";}onExited: {rect1.state = "";}
}

通过上述代码,我们实现了以下逻辑:

  • 当用户点击矩形时,状态在 "clicked" 和默认状态之间切换。
  • 当鼠标悬停时,状态切换为 "hovered",鼠标移开时恢复默认状态。

使用 when 自动控制状态

除了手动切换状态,Qt Quick 还允许我们使用 when 条件来自动根据某些条件进行状态转换。when 属性允许我们定义当条件满足时切换到某个状态,而无需手动设置。

使用 when 条件

我们可以通过 when 属性来自动设置状态,无需通过代码直接修改 state 属性。when 语句通过布尔表达式决定是否切换到该状态。

import QtQuick 2.15
import QtQuick.Window 2.15
Rectangle {id: rect1width: 100height: 100color: "red"anchors.centerIn: parent// 定义状态states: [State {name: "clicked"when: mouseArea.pressedPropertyChanges {target: rect1color: "blue"scale: 1.5}},State {name: "hovered"when: mouseArea.containsMousePropertyChanges {target: rect1color: "green"}}]// 鼠标区域MouseArea {id: mouseAreaanchors.fill: parenthoverEnabled: true}
}

在这个例子中:

  • 当鼠标悬停在矩形上时,when: mouseArea.containsMouse 触发 "hovered" 状态,矩形颜色变为绿色。
  • 当用户按下鼠标时,when: mouseArea.pressed 触发 "clicked" 状态,矩形颜色变为蓝色并放大。

这样使用 when 可以避免直接操作状态,状态的切换会根据用户操作自动完成。

添加过渡动画 (Transitions)

基础过渡动画

为了使状态切换更加流畅,Qt Quick 提供了 Transition 元素,它允许我们为状态变化添加动画。通过 Transition,状态之间的属性变化不会瞬间发生,而是会随着时间逐渐变化。

transitions: Transition {from: ""to: "clicked"NumberAnimation {properties: "scale,rotation"duration: 500}
}

在上面的代码中,当状态从默认状态切换到 "clicked" 时,scalerotation 属性将在 500 毫秒内逐渐变化,使切换效果更自然。

针对不同状态的多重过渡

如果需要为不同状态间的切换定义不同的动画,可以定义多个 Transition,并指定 fromto 状态。

transitions: [Transition {from: ""to: "hovered"ColorAnimation {target: rect1property: "color"duration: 300}},Transition {from: ""to: "clicked"NumberAnimation {properties: "scale"duration: 500}}
]

在这个例子中:

  • 当切换到 "hovered" 状态时,矩形颜色的改变会在 300 毫秒内完成。
  • 当切换到 "clicked" 状态时,scale 属性的变化会在 500 毫秒内完成。

状态扩展与嵌套

使用 extend 扩展状态

有时候我们希望一个状态基于另一个状态,并添加或修改部分属性。extend 关键字允许我们在一个状态的基础上扩展出新的状态。

State {name: "extendedClicked"extend: "clicked"PropertyChanges {target: rect1rotation: 90}
}

在这个例子中,extendedClicked 状态继承了 clicked 状态的所有属性变化,并且增加了 rotation 属性的变化。

嵌套状态

Qt Quick 允许在组件层次结构中嵌套状态,父组件的状态可以影响子组件的行为。我们可以在父组件中定义状态,并在子组件中使用 State 来响应这些状态变化。

总结

在本教程中,我们通过多个示例详细介绍了如何使用 Qt Quick 中的 State 管理组件的不同状态。我们讨论了 StatePropertyChangeswhen 的使用,展示了如何通过用户交互事件触发状态切换,以及如何使用 Transition 添加动画效果。

State 机制极大地简化了组件状态管理的复杂性,让开发者能够更高效地实现 UI 中的状态切换。通过合理利用 when 条件和动画过渡,可以轻松创建用户体验更为友好的动态界面。

相关文章:

【Qt Quick】状态:State 使用

State 是 Qt Quick 中管理界面组件状态的关键工具。它允许我们定义组件的不同状态,并且在用户交互或事件发生时进行状态切换,从而实现属性、外观和行为的动态变化。通过使用 State,可以避免复杂的条件逻辑,使代码更加简洁和可维护…...

ICE/TURN/STUN/Coturn服务器搭建

ICE 当我们想要实现在公网环境下的语音/视频通话功能时,就需要用到ICE交互式连接建立。ICE不是一种协议,整合了 STUN 和 TURN 两种协议(用于 NAT 穿透)的框架。 ICE的主要目标是解决NAT(网络地址转换)穿越…...

ctf.bugku-eval

题目来源&#xff1a;eval - Bugku CTF 访问页面&#xff0c; 代码解释 <?phpinclude "flag.php"; //包含"flag.php"文件$a $_REQUEST[hello]; //从请求参数hello中获取值并赋给变量$a。 eval( "var_dump($a);"); //…...

Extreme Compression of Large Language Models via Additive Quantization阅读

文章目录 Abstract1. Introduction2. Background & Related Work2.1. LLM量化2.2. 最近邻搜索的量化 3.AQLM:Additive Quantization for LLMs3.1. 概述3.1.0 补充**步骤说明****举例说明** 3.2. 阶段1&#xff1a;代码的波束搜索3.3. 阶段2&#xff1a;码本更新3.4. 阶段3&…...

【虚拟化】内核级虚拟化技术KVM介绍,全/半虚拟化的区别,使用libvirt搭建虚拟化平台(go/java/c++)

【虚拟化】内核级虚拟化技术KVM介绍&#xff0c;全/半虚拟化的区别&#xff0c;使用libvirt搭建虚拟化平台&#xff08;go/java/c&#xff09; 文章目录 1、虚拟化技术分类与架构&#xff08;KVM&#xff0c;Xen&#xff09;&#xff0c;全/半虚拟化的区别2、libvirt介绍3、使用…...

C++类成员变量的初始化

1、优先使用或{} 类的非静态数据成员在声明时&#xff0c;使用或{}进行初始化执行默认初始化&#xff0c;构造函数只处理一些特殊成员。 2、直接初始化 使用()进行初始化、new运算符和类构造函数的初始化列表。 3、拷贝初始化 使用进行初始化、函数传参、函数返回值。 隐式调用…...

Golang 中的强大 TUI 库 ——tview

在命令行界面下创建丰富的用户交互界面是许多开发者的需求&#xff0c;而 Golang 语言中有一个非常出色的 TUI&#xff08;文本用户界面&#xff09;库 ——tview。本文将详细介绍 tview 库&#xff0c;并与其他流行的 TUI 库进行对比&#xff0c;最后进行总结。 一、tview 库介…...

电层相关 -- 支路板与线路板

华为OTN产品系列支持 支路板、线路板分离架构 。支路/线路板和集中交叉单板配合使用&#xff0c;除了可以完成OTU单板功能外&#xff0c;还可通过集中交叉单板进行各级别ODUk颗粒业务调度&#xff0c; 实现更加灵活的电层信号调度及更高的带宽利用率。 支路板 功能 实现客户…...

leetcode 93.复原ip地址

1.题目要求&#xff1a; 2.题目代码: class Solution { public:vector<string> result;// 记录结果// startIndex: 搜索的起始位置&#xff0c;pointNum:添加逗点的数量void backtracking(string& s, int startIndex, int pointNum) {if (pointNum 3) { // 逗点数…...

AI+视频监控:EasyCVR安防平台赋能火电制造行业的视频智能管理方案

随着信息技术的飞速发展和智能制造的深入推进&#xff0c;火电制造行业作为国民经济的重要组成部分&#xff0c;正面临着智能化转型的迫切需求。为了提升生产效率、保障设备安全、优化管理流程&#xff0c;火电制造企业迫切需要引入先进的视频监控与人工智能技术。EasyCVR安防监…...

UIP协议栈 TCP Server Client通信成功案例

文章目录 这里边有相当好的 [UIP 文档资料&#xff0c;文档位置在仓库的UIP/uip doc &#xff0c;括号内是仓库地址&#xff08;https://gitee.com/free-people-in-time-and-space/net-work-learn-note.git &#xff09;TCP Server1.main循环里做的事2.以下是main循环里相关函数…...

Android Studio Koala Feature Drop 稳定版现已推出

作者 / Android Studio 产品经理 Sandhya Mohan Android Studio Koala Feature Drop (2024.1.2) 现已推出&#xff01;&#x1f428; &#x1f517; Android Studio https://developer.android.google.cn/studio 今年早些时候&#xff0c;我们宣布每个 Android Studio 动物版本…...

胤娲科技:AI评估新纪元——LightEval引领透明化与定制化浪潮

AI评估的迷雾&#xff0c;LightEval能否拨云见日&#xff1f; 想象一下&#xff0c;你是一位AI模型的开发者&#xff0c;精心打造了一个智能助手&#xff0c;却在最终评估阶段遭遇了意外的“滑铁卢”。 问题出在哪里&#xff1f;是模型本身不够聪明&#xff0c;还是评估标准太过…...

Python安装|PyCharm Professional 下载安装教程。2024最新版,亲测使用!

一、下载地址&#xff1a; 二、Python的下载及安装&#xff1a; 1、从上面网址进入Python官网 2、安装流程图&#xff1a; 双击已经下载好的python-*.*.*-amd64.exe文件&#xff0c;开始安装 最后就等它自己安装完成就好了 3、检验是否安装完成&#xff1a; windowsR快捷键…...

JavaSwitch控制流语句

在Java中&#xff0c;switch语句是一种控制流语句&#xff0c;用于根据变量的不同值执行不同的代码块。它提供了一种替代if-else语句的方式&#xff0c;使代码更简洁和易于阅读。以下是switch语句的基本语法和使用示例。 基本语法 switch (expression) {case value1:// 执行代码…...

PCL 3D-SIFT关键点检测(Z方向梯度约束

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 SIFT关键点检测 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#…...

肺结节分割与提取系统(基于传统图像处理方法)

Matlab肺结节分割(肺结节提取)源程序&#xff0c;GUI人机界面版本。使用传统图像分割方法&#xff0c;非深度学习方法。使用LIDC-IDRI数据集。 工作如下&#xff1a; 1、读取图像。读取原始dicom格式的CT图像&#xff0c;并显示&#xff0c;绘制灰度直方图&#xff1b; 2、图像…...

ESP32 COAP 客户端观察者模式下,GET服务器的例程

目录 环境准备 示例代码 代码解释 初始化: CoAP 上下文和会话: 注册响应处理函数: 创建和发送 GET 请求: 处理响应: 主循环: 注意事项 ESP32 是一款功能强大的微控制器,支持多种通信协议,包括 CoAP(Constrained Application Protocol)。CoAP 是一种专为物联…...

【Kubernetes】常见面试题汇总(五十七)

目录 125. K8S 创建服务 status 为 ErrlmagePull&#xff1f; 126.不能进入指定容器内部&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 …...

Java 设计模式 构建者模式

文章目录 1 概念2 使用方法1 创建步骤&#xff1a;2 使用步骤&#xff1a; 参考 1 概念 builder模式又叫建造者模式&#xff0c;属于创建型模式 作用&#xff1a;将一个复杂对象的构建与他的表示分离&#xff0c;可以一步一步构建对象&#xff0c;而不是使用构造函数构造一次…...

建设企业网站如何建

首先&#xff0c;企业网站是企业数字化转型的重要组成部分。在数字化浪潮的冲击下&#xff0c;企业需要通过建设网站来实现信息化管理&#xff0c;提高工作效率。通过企业网站&#xff0c;企业可以便捷地发布最新产品信息、公司新闻、招聘信息等&#xff0c;极大地提升了信息传…...

C++ inline 的更进一步理解

文章目录 1.概述2.ODR(One Definition Rule)问题3.范例测试代码4.好坏分析 ODR: One Definition Rule&#xff0c;即单一定义规则&#xff0c; C 语言中非常重要的一项规则&#xff0c;它确保程序的行为一致性并避免链接时出现冲突。ODR 的核心思想是在整个程序中&#xff0c;每…...

海康威视云台相机图像获取

直接上代码&#xff1a; import cv2# 替换为正确的RTSP链接 rtsp_url rtsp://admin:abcd12345192.168.1.64:554/h264/ch1/main/av_stream cap cv2.VideoCapture(rtsp_url)if not cap.isOpened():print("无法打开视频流&#xff0c;检查RTSP URL和凭证") else:whil…...

什么是词嵌入(Word Embedding)

1. 什么是词嵌入(Word Embedding) ⾃然语⾔是⼀套⽤来表达含义的复杂系统。在这套系统中&#xff0c;词是表义的基本单元。顾名思义&#xff0c;词向量是⽤来表⽰词的向量&#xff0c;也可被认为是词的特征向量或表征。把词映射为实数域向量的技术也叫词嵌⼊&#xff08;word e…...

LSTM时间序列模型实战——预测上证指数走势

LSTM时间序列模型实战——预测上证指数走势 关于作者 作者&#xff1a;小白熊 作者简介&#xff1a;精通python、matlab、c#语言&#xff0c;擅长机器学习&#xff0c;深度学习&#xff0c;机器视觉&#xff0c;目标检测&#xff0c;图像分类&#xff0c;姿态识别&#xff0c;…...

基于 STM32F407 的 SPI Flash下载算法

目录 一、概述二、自制 FLM 文件1、修改使用的芯片2、修改输出算法的名称3、其它设置4、修改配置文件 FlashDev.c5、文件 FlashPrg.c 的实现 三、验证算法 一、概述 本文将介绍如何使用 MDK 创建 STM32F407 的 SPI Flash 下载算法。 其中&#xff0c;SPI Flash 芯片使用的是 W…...

力扣之1355.活动参与者

题目&#xff1a; Sql 测试用例&#xff1a; Create table If Not Exists Friends (id int, name varchar(30), activity varchar(30)); Create table If Not Exists Activities (id int, name varchar(30)); Truncate table Friends; insert into Friends (id, name, acti…...

数据资产治理:构建敏捷与安全的数据管理体系

在当今数字化的盛况下&#xff0c;作为核心资产的数据已经越发受到企业的重视。但是随着公司的逐步壮大&#xff0c;如何分析这些数据以及如何有效治理数据资产&#xff0c;以确保安全性、合规性以及易用性&#xff0c;是企业面临的重大挑战。数聚股份将从多年从业经验深度探讨…...

Nodejs连接Mysql笔记

框架搭建 安装Node.js 首先&#xff0c;确保你已经在系统上安装了Node.js和npm&#xff08;Node Packaged Modules&#xff09;。你可以通过以下命令检查是否已经安装&#xff1a;shell 或者 node -v 或者 npm -v 数据库连接代码 1.导入MySQL2库 npm install mysql2 2.在文件…...

Canvas:AI协作的新维度

在人工智能的浪潮中&#xff0c;OpenAI的最新力作Canvas&#xff0c;不仅是一款新工具&#xff0c;它标志着人工智能协作方式的一次革命性飞跃。Canvas为写作和编程提供了一个全新的交互界面&#xff0c;让用户能够与ChatGPT进行更紧密、更直观的协作。 ​​​​​​​ Canvas的…...