状态分组共享切换

 解决当需要所有状态都可以切换到最终状态时,每个状态都要单独关联的问题。

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

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); //动画结束退出

    //设置状态机的初始状态并启动状态机
    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、付费专栏及课程。

余额充值