#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();
}