您的位置:首页 > 编程语言 > Qt开发

Qt有限状态机简单介绍

2016-04-01 19:38 483 查看
有限状态机,(英语:Finite-state machine,FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。——————————————————–来自百度百科

[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]从有限状态机、图灵机到现代计算机(二)(原文貌似没法打开了,这个是转载的)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: