Qt有限状态机简单介绍
2016-04-01 19:38
483 查看
有限状态机,(英语:Finite-state machine,FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。——————————————————–来自百度百科
[1]下面的例子就是一个简单的状态机:
有一自动门,它可以被锁上,也可以开锁。当门锁上时,某人可以在它的槽中塞进一枚硬币。这样,门就会自动开锁,转变到开锁的状态;人通过后,门就会自动锁上。
对状态进行分析可得下图:
![](http://img.blog.csdn.net/20160401191307738)
很容易看出此状态机的状态和状态转移条件。
好了,上面是对有限状态机进行了简单的介绍。接下来用一个简单的程序演示在Qt中的StateMachine的使用。
在本程序中只有一个widget,widget内有一个Label和一个Button用来显示及切换状态。
下面是widget.h及widget.cpp的内容
上面的程序创建了一个拥有3个状态的状态机,并且转移条件都是点击按钮依次进入下一个状态。下面是程序效果
![](http://img.blog.csdn.net/20160401194516500)
文章引用
[1]从有限状态机、图灵机到现代计算机(二)(原文貌似没法打开了,这个是转载的)
[1]下面的例子就是一个简单的状态机:
有一自动门,它可以被锁上,也可以开锁。当门锁上时,某人可以在它的槽中塞进一枚硬币。这样,门就会自动开锁,转变到开锁的状态;人通过后,门就会自动锁上。
对状态进行分析可得下图:
很容易看出此状态机的状态和状态转移条件。
好了,上面是对有限状态机进行了简单的介绍。接下来用一个简单的程序演示在Qt中的StateMachine的使用。
在本程序中只有一个widget,widget内有一个Label和一个Button用来显示及切换状态。
下面是widget.h及widget.cpp的内容
//widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QStateMachine> class QLabel; class QPushButton; class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); private: QStateMachine sm; //定义一个状态机 QLabel *m_state; //label用于显示当前状态 QPushButton *m_button;//button用于切换状态 }; #endif // WIDGET_H
//widget.cpp #include "widget.h" #include <QLabel> #include <QState> #include <QVBoxLayout> #include <QPushButton> Widget::Widget(QWidget *parent) : QWidget(parent) { m_state = new QLabel("Initialization"); m_button = new QPushButton("Change state"); //创建mainLayout用于窗口布局 QVBoxLayout *mainLayout = new QVBoxLayout; //将label和button添加到layout mainLayout->addWidget(m_state); mainLayout->addWidget(m_button); //设置当前窗口布局 setLayout(mainLayout); //创建3个状态 QState *s1 = new QState; QState *s2 = new QState; QState *s3 = new QState; //为每个状态添加状态转移条件及转移目标 s1->addTransition(m_button, SIGNAL(clicked(bool)), s2); s2->addTransition(m_button, SIGNAL(clicked(bool)), s3); s3->addTransition(m_button, SIGNAL(clicked(bool)), s1); //QState::assignProperty()函数可用于当进入某个状态时设置某个QObject的一个属性,这里我们改变label的text属性,这样我们就能知道当前的状态在哪里了 s1->assignProperty(m_state, "text", "Idel"); s2->assignProperty(m_state, "text", "Walk"); s3->assignProperty(m_state, "text", "Run"); //把3个状态添加到状态机中 sm.addState(s1); sm.addState(s2); sm.addState(s3); //初始化状态机 sm.setInitialState(s1); //启动状态机 sm.start(); } Widget::~Widget() { delete m_state; delete m_button; }
上面的程序创建了一个拥有3个状态的状态机,并且转移条件都是点击按钮依次进入下一个状态。下面是程序效果
文章引用
[1]从有限状态机、图灵机到现代计算机(二)(原文貌似没法打开了,这个是转载的)
相关文章推荐
- Qt操作SQLite数据库——创建、打开、关闭、增加、删除和修改操作
- Qt中序列化对象
- rabbitmq3.6.1 集群的安装(启用MQTT插件)
- 最近在用Qt Creator,把遇到的一点点小问题记在这里
- Qt4.8.7连接MySql数据库(windows环境)
- Qt带进度条的启动界面
- Qt程序只运行一个实例
- Qt生成随机数的方法
- 解决QT 编译后脱离编译器无法运行的问题
- qt 截获windows消息
- Qt获取鼠标位置(绝对位置、相对位置)
- qt程序启动画面
- [QT入门篇]4 QT的元对象系统
- qt中创建进程
- qt窗口的切换
- qt事件机制---事件范例
- qt中的事件机制
- qt的信号与槽函数
- qt中的udp编程
- VS2015和Qt5.6