Qt状态机学习4

                     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(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");


                   

                    

你可能感兴趣的:(qt,C/C++,qt)