qt 状态机小记

状态机、状态、信号

状态机框架与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()信号。此时状态机停止。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值