本文通过一个典型的状态机模型,来说明如何在Qt中使用状态机.
该模型有两个状态S1和S2,其中S1又有两个子状态S11和S12,S1为状态机的初始状态,S11为S1的初始状态.为了模拟一些嵌入式开发中的需要,在s12中启动了一个定时器,在S2中建立了一个模式对话框.
对于一个确定的状态,其进入和退出时会分别发射entered()信号和exited()信号,你可以通过connect函数将该信号连接到自定义的状态入口和出口函数,而在进入一个确定的状态时,一般在其入口函数处初试化其状态.当从一个状态迁移到另一个状态时,它会先退出自身,然后退出其父状态(如果有父的话),然后在进入另一个状态.
关于状态迁移,子状态会自动继承父状态的transition.因此,你不需要为每个子状态(如s11和s12)都添加一个transition,而只需要为它们的父状态添加一个transition就可以了.
需要明确一点,在一个子状态中,不建议使用阻塞函数(比如模式对话框),因为你一旦引入阻塞,将会打断诸如定时器等发出的信号,将使状态机无法响应,当然,特殊的情况例外.
好了,看代码
MyStateMachine::MyStateMachine(QWidget *parent) :
QDialog(parent),
ui(new Ui::MyStateMachine)
{
ui->setupUi(this);
timer = new QTimer;
machine = new QStateMachine();
s1 =new QState();
s11 = new QState(s1);
s12 = new QStat