状态机、状态、信号
状态机框架与Qt的元对象系统是紧密结合的,例如Qt的事件系统用来驱动状态机,状态机中状态间的切换可以由信号来触发。关于状态机可以参考The State Machine Framework关键字。如下的示例中,状态机被一个按钮控制,包含3个状态s1、s2、s3,s1为初始状态,当单击按钮时状态机切换到另一个状态并设置了新的geometry属性值,可以看到单击按钮的话按钮会在三个位置轮流切换:
#include <QApplication>
#include <QPushButton>
#include <QStateMachine>
#include <QState>
#include <QFinalState>
#include <QMessageBox>
int main(int argc,char* argv[])
{
QApplication app(argc,argv);
QPushButton button(QObject::tr("state Machine"));
//三个状态
QStateMachine machine;
QState* s1 = new QState(&machine);
QState* s2 = new QState(&machine);
QState* s3 = new QState(&machine);
QFinalState* finalState = new QFinalState(&machine);
//设置状态
s1->assignProperty(&button,"geometry",QRect(100, 100, 100, 50));
s2->assignProperty(&button,"geometry",QRect(300, 100, 100, 50));
s3->assignProperty(&button,"geometry",QRect(200, 200, 100, 50));
//状态转换
s1->addTransition(&button,SIGNAL(clicked()),s2);
s2->addTransition(&button,SIGNAL(clicked()),s3);
s3->addTransition(&button,SIGNAL(clicked()),finalState);
//当进入状态后将会 触发 entered() 信号
//当进入QFinalState 类型的状态时,状态机将会停止并发出finished() 信号
QObject::connect(finalState,SIGNAL(entered()),&button,SLOT(showMinimized()));
//状态退出时的信号捕获
QMessageBox msgBox;
msgBox.setText("The document has been modified.");
QObject::connect(s2,SIGNAL(exited()),&msgBox,SLOT(exec()));
//状态机退出时信号捕获演示
QObject::connect(&machine,SIGNAL(finished()),&button,SLOT(close()));
machine.setInitialState(s1);
machine.start();
button.show();
app.exec();
}
主要阐述3点:
1 状态机框架与Qt的元对象系统是紧密结合的,QState 代表得是某一时刻得状态,代表某一属性得某个时刻得状态。
2 在状态转换得过程中,进入状态后会触发 entered()信号,退出状态时,会收到exited()信号。
3 如果切换到QFinalState 状态时,代表退出状态机。此时会触发finished()信号。此时状态机停止。