详解Qt中的状态机机制(一)

2024-05-26 17:48
文章标签 详解 qt 机制 状态机

本文主要是介绍详解Qt中的状态机机制(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


状态机,简写为FSM(Finite State Machine),状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。


    在GUI开发的时候,界面复杂的逻辑往往令人抓狂,逻辑都不清晰,代码写起来更加费劲。用户界面设计中采用状态驱动,就可以使得GUI的逻辑更加清晰。根据当前状态的不同,显示不同的界面。程序界面可以被看作显示对应不同场景,或者是通过改变外观响应用户的交互。通常情况下,界面中很多个组件的改变是并发进行的,这样的界面可以看作从一个状态改变到另外一个状态。


    今天我们来看看qt中的状态机框架,qt把它作为QtCore中的一个模块,也足见其重要性:


    Qt状态机框架提供了一些类来创建执行状态图,状态图为一个系统如何对外界激励进行反应提供了一个图形化模型,该模型是通过定义一些系统可能进入的状态以及系统怎样从一个状态切换到另一个状态来实现的。事件驱动的系统的一个关键特性就是它的行为不总是仅仅依赖于前一个或者当前的事件,而且也依赖于将要执行的事件。通过使用状态图,这些信息会非常容易进行表达。状态机框架提供了一套API以及一种执行模型,可以有效地将状态图的元素和语义嵌入到Qt应用程序中。该框架与Qt的元对象系统结合紧密:例如,不同状态之间的转化可由信号触发,信号驱动,且状态可配置用于QObject的属性和方法。


在进入今天的主题之前,我们先来了解三个概念:

状态(State):是静态的东西,对一系列对象属性的一组静态描述和配置。

过渡(Transition):是一段时间或者空间的描述,状态之间切换的整个过程,或者描述的是不同属性值之间变化的一个过程。

动画(Animation):是动态的一个东西,可以看作是过渡的执行者,通过在属性值上应用动画类型来创建。动画类型会对属性值进行插值,从而创建出平滑的过渡效果。要创建动画,需要为某个属性使用恰当的动画类型;应用的动画也依赖于需要实现的行为类型。


这三者之间的联系较为密切,只定义了状态,它是一个死(静态)的东西,所以就需要过渡,来让它活起来。但是过渡这个过程是如何实现,就需要动画来执行,从而让过的的平滑,给用户良好的视觉效果。

在Qt中,这三者之间的关系有没有那么明确,但是明确这三个概念,对于我们理解qt中的状态机制会有很大的帮助。


一、状态


对于初学者来说,我建议从qml中去学习了解状态机的概念会更快。它描述性的语言,会让人很快的去接受这些概念和使用。在你了解了qml中状态机的使用后,再来了解qt中的状态机就会发现很简单。今天我们就先从qml中了解一些状态机的魅力。


在qml中,继承自Item的控件都会有一个states属性,该属性有用户自定义的属性组组成。可以通过PropertyChanges、ParentChange、StateChangeScript、 AnchorChanges这些控件对这个状态中的属性做定义和描述。下面是一个简单的代码示例:


import QtQuick 2.0Rectangle {id: rootwidth: 100; height: 100states: [State {name: "red_color"PropertyChanges { target: root; color: "red" }},State {name: "blue_color"PropertyChanges { target: root; color: "blue" }}]
}

二、渐变



在状态改变的过程中,我们可以指定一个过渡,可以采用Transition 、Behavior这两个控件,可以在这个过渡中指定各种动画,从而达到想要的交互效果。

import QtQuick 2.0Rectangle {id: rectwidth: 100; height: 100color: "red"MouseArea {id: mouseAreaanchors.fill: parent}states: State {name: "moved"; when: mouseArea.pressedPropertyChanges { target: rect; x: 50; y: 50 }}transitions: Transition {NumberAnimation { properties: "x,y"; easing.type: Easing.InOutQuad }}
}
这个小示例借助Item的transitions属性,qt帮助文档上的描述,This property holds the list of transitions for this item. These define the transitions to be applied to the item whenever it changes its state.,只有在状态属性发生改变,才会触发这个渐变,再运用NumberAnimation,完成这个渐变。

import QtQuick 2.0Rectangle {width: 400height: 400Rectangle {id: coloredRectwidth: 100height: 100anchors.centerIn: parentcolor: "red"Behavior on color {ColorAnimation {}}MouseArea {id: mouseranchors.fill: parenthoverEnabled: true}states: State {name: "GreenState"when: mouser.containsMousePropertyChanges {target: coloredRectcolor: "green"}}}
}
这串代码也实现了状态的渐变,区别在于Behavior这个控件不仅可以用于状态的改变,在没有使用状态,只要安装Behavoir监控的属性发生了改变,就会运用相应的动画平滑的完成这个渐变,使用起来相当方便。

以上的两部分讲的就是状态和渐变,借助qml这种描述性语言,我们也可很方便的完成GUI的开发,很容易做出漂亮的效果。在上面的实例中,大家发现也有很多动画,所以说,状态、渐变、动画三者关系是很密切的,下面,我们来看看动画。


三、动画


上面的图是qtquick中的所有用到的动画的一个关系图,他们都继承自Animation这个最基础的控件,这个控件提供了动画的控制,开始,暂停,重播,播放次数。此外它还提供了两个信号,started() 和 stopped(),以供其他控件去捕捉该信号去响应其他的槽函数。在平时开发中运用较多的是 PropertyAnimation这个控件。Qt系统中强大的元对象系统,使得对属性的操作很方便,所以这个PropertyAnimation就可以对这些属性做动画。而且它还带Easing Curve缓和曲线,qt中提供了四十多种缓和曲线,让开发者更方便的定义动画的效果。此外还有ParallelAnimation 、 SequentialAnimation 这两个控件,一个是平行动画组,一个是串行动画组,这两个又可以相互的嵌套,使用非常的方便。在使用的时候,可能又会遇到想要在两个动画之间加一段空白暂停的时间,这时候 PauseAnimation 就可以达到你想要的效果。


总结:今天主要讲解的是qt QML中的状态机制,这个对于刚接触qt的新手会比较好上手,了解了这些概念和控件的使用,我们基本上就可以完成一些基本的交互界面的开发。

后续  详解Qt中的状态机机制(二)中会讲解qt C++中的状态机制以及和QML中的状态机制的比较。

这篇关于详解Qt中的状态机机制(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005164

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

【Tools】大模型中的自注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一种在Transformer等大模型中经常使用的注意力机制。该机制通过对输入序列中的每个元素计算与其他元素之间的相似性,

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分