保存和恢复状态机的历史状态

#include <QApplication>
#include <QPushButton>
#include <QStateMachine>
#include <QSignalTransition>
#include <QPropertyAnimation>
#include <QFinalState>
#include <QHistoryState>
#include <QMessageBox>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPushButton button("State Machine");
    QPushButton quit_button("Quit");
    //创建状态机和3个状态,将3个状态添加到状态机中
    QStateMachine machine;
    QState *s1 = new QState(&machine);//顶层状态
    QState *s11 = new QState(s1);
    QState *s12 = new QState(s1);
    QState *s13 = new QState(s1);
    s1->setInitialState(s11);//设置初始子状态
    s11->assignProperty(&button, "geometry", QRect(100, 100, 120, 50));
    s12->assignProperty(&button, "geometry", QRect(300, 100, 120, 50));
    s13->assignProperty(&button, "geometry", QRect(200, 200, 120, 50));
    //点击按钮状态切换
    QSignalTransition *transition_1 = s11->addTransition(&button, &QPushButton::clicked, s12);
    QSignalTransition *transition_2 = s12->addTransition(&button, &QPushButton::clicked, s13);
    QSignalTransition *transition_3 = s13->addTransition(&button, &QPushButton::clicked, s11);
    //添加动画
    QPropertyAnimation *animation = new QPropertyAnimation(&button, "geometry");
    transition_1->addAnimation(animation);
    transition_2->addAnimation(animation);
    transition_3->addAnimation(animation);
    QObject::connect(s13, &QState::entered, &button, &QPushButton::showMinimized);//状态进入信号
    QFinalState *s2 = new QFinalState(&machine);
    s1->addTransition(&quit_button, &QPushButton::clicked, s2);//将顶层状态关联到按钮
    s12->addTransition(&quit_button, &QPushButton::clicked, s12);//子状态覆盖继承的切换
    QObject::connect(&machine, &QStateMachine::finished, qApp, &QApplication::quit); //动画结束退出
    //历史状态
    QPushButton interrupt_button("interrupt");
    interrupt_button.show();
    QHistoryState *slh = new QHistoryState(s1);//将要记录状态的父状态作为父类,保存退出状态时所在的子状态
    QState *s3=new QState(&machine);//顶层状态
    QMessageBox mbox;
    mbox.addButton(QMessageBox::Ok);
    mbox.setText("Interrupted!");
    mbox.setIcon(QMessageBox::Information);
    QObject::connect(s3,SIGNAL(entered()),&mbox,SLOT(exec()));
    s3->addTransition(slh);//返回历史状态
    s1 ->addTransition(&interrupt_button,SIGNAL(clicked()),s3);
    //设置状态机的初始状态并启动状态机
    machine.setInitialState(s1);
    machine.start();
    button.show();
    quit_button.move(300, 300);
    quit_button.show();
    return a.exec();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值