Qt的状态机运行在自己的事件循环中。对一个信号装换(QSignalTransition objects),当状态机接受一个信号时,状态机自动会产生一个相应的信号事件即QStateMachine::SignalEvent给他自己。对于QObject的事件过渡,则产生一个QStateMachine::WrappedEvent事件。
在前面的例子中
s.addTransition(&iButton,SIGNAL(clicked()),&is);我们之间连载了一个信号上,这个信号不带参数,所以我们不需要分别处理,如果对一个状态对外部要分别处理,那只有添加按钮,显然不好。如果信号带了参数,那些在这基础之上是不能起作用的,那么就需要用到QSignalTransition。
下面举了一个例子,使用一个QcheckBox来控制两个状态
首要因为有连个不同的状态,所以要通过继承QSignalTransition得到一个CheckedTransition和一个UncheckedTransition分别对应checked和unchecked。需要实现一个虚函数eventTest,因为信号带参数,所以在这种对参数进行比较得到我们需要的信号。
bool UncheckedTransition::eventTest(QEvent *event)
{
if (!QSignalTransition::eventTest(event)) {
return false;
} else {
QStateMachine::SignalEvent *e = static_cast<QStateMachine::SignalEvent*>(event);
return (e->arguments().at(0).toInt() == Qt::Unchecked);
}
}
然后创建一个状态机就可以,添加这两个基于signal的过渡就行了。
p_sm = new QStateMachine(this);
p_s1 = new QState;
p_s2 = new QState;
p_s3 = new QState;
p_sm->addState(p_s1);
p_sm->addState(p_s2);
p_sm->addState(p_s3);
CheckedTransition *c = new CheckedTransition(ui->checkBox);
c->setTargetState(p_s2);
p_s1->addTransition(c);
UncheckedTransition *u = new UncheckedTransition(ui->checkBox);
u->setTargetState(p_s3);
p_s1->addTransition(u);
p_s2->addTransition(p_s1);
p_s3->addTransition(p_s1);
p_sm->setInitialState(p_s1);
connect(ui->pushButton,SIGNAL(clicked()),p_sm,SLOT(start()));
p_s2->assignProperty(ui->label,"text","checd");
p_s3->assignProperty(ui->label,"text","unchecd");
![](https://img-my.csdn.net/uploads/201304/24/1366785079_6042.png)