Qt状态机学习4

53 篇文章 2 订阅
53 篇文章 36 订阅

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


                   

                    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值