QT状态机框架

状态机(The State Machine Framework)

作者:刘旭晖 Raymond 转载请注明出处
Email:[email protected]
BLOG:http://blog.csdn.net/colorant/

 

QT的State Machine Framework是在Qt4.6中引入的,其理论基础是Harel的Statechart,通过定义一系列的可能状态,以及系统如何在这些状态中进行转换(Transitions between states)来描述整个状态机的运行。

 

状态机体系结构

QT的状态机体系主要包括三部分模块:

  • 以QAbstractState为基类的QState,以及QFinalState,QHistoryState等表示状态的类
  • 以QAbstractTransition为基类的用来表示各类状态转换行为(Transition)的类(包括:事件触发/信号触发/鼠标键盘触发的转换等类别)
  • QStateMachine状态机类

特性

基本功能

光有状态机本身,只是定义状态转换,什么事情也不做的话,这样的状态机也就没有什么用

  • QState类可以和一个控件属性绑定,在进入这个状态时,设定该属性值
  • 也可以通过连接QState的entered和exited信号,执行指定的槽函数。

状态机的退出

你可以定义一个永不结束的状态机,也可以通过QFinalState给状态机添加一个“结束状态”,当状态机转换到这个状态以后,整个状态机就会结束并退出运行。

 

状态嵌套

  • 状态本身可以嵌套,一个大的状态内部可以细分子状态,通过状态嵌套机制和并行状态机制,可以实现
      状态转换的归组(比如可以用一个Transtion将一组的状态都转向另一个状态,用来实现,比如退出键)
  • 多个状态转换参数的并行监控,以避免创建过多的独立状态(因为如果每个参数都是独立互斥的,那么状态的数目量级为O(N^2))

状态的转换,不受嵌套机制的影响,也就是说你可以定义从任意层级的状态转换到其它状态。

动画属性值

状态转换可以配合Animation相关类,实现对象属性值的动画效果。针对一些边际场合,State相关类还提供的函数用于判定属性值是否已经完成赋值(如果在动画过程中,属性值是在变化的,不算赋值完毕),以及动画完成前,状态提前退出时的属性参数设置设定机制等。

 

历史状态

QHistoryState类,并不像我所想象的那样,是用来跟踪和记录历史状态的记录堆栈。到底是什么用途,看看如何使用它就知道了。

 

QHistoryState必须被添加为一个父状态组的成员状态。当父状态组退出(转换到状态组外部的其它状态)时,会自动把当前的状态记录到QHistoryState中,外部状态转换回来时,不需要知道原先的状态是该状态组中具体的哪一个,只需要转向状态组中的历史状态成因就可以了。

 

所以,历史状态的使用,应该更多的是为了记录一个被打断的状态,比如跳到一个外部状态处理一些事情,然后再返回到被打断的状态。

 

无目标状态转换

所谓无目标状态转换(Targetless Transitions),是指当一个状态转换动作被触发时,并不转向另一个状态,只是触发一个QAbstractTramsotopm::triggered信号。你可以链接这个信号来做一些处理。

 

需要注意的是:Targetless Transitions是通过初始化一个Transition类时,不指定目标状态来实现的,如果明确指定的目标状态为源状态(比如S1->S1),那么该状态会先退出,再进入,从而依次触发QAbstractState::entered和QAbstractState::exited 信号。

 

实际应用场合

本来,图形界面应用程序编程多数都是用户交互驱动的,似乎并没有什么特殊的地方一定需要使用状态机驱动来辅助,不知道有什么应用场景,是特别适合使用状态机的?

 

你可能感兴趣的:(65.QT框架基础)