2.Qt状态机(QState)的学习日志2
状态机的分层,子状态继承父状态,父状态来添加转换条件,实现子状态间任意跳转。就不用子状态添加每一种跳转情况了。多个控件的的动画效果需要动画组类,把每个动画添加到组中,在把组添加到跳转中
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QState>
#include <QStateMachine>
#include <QPropertyAnimation>
#include <QFinalState>
#include <QSignalTransition>
#include <QParallelAnimationGroup>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
list = findChildren<QLabel *>();
QState *Parent = new QState()//创建父类
QFinalState *final = new QFinalState();//创建终态
//子状态添加父状态
QState *StateRect = new QState(Parent);
QState *StateLine1 = new QState(Parent);
QState *StateLine2 = new QState(Parent);
QState *StateTri = new QState(Parent);
QState *StatePos = new QState(Parent);
//矩形
int num = 0;
for(int i=60;i<=180;i+=60)
{
for(int j=60;j<=180;j+=60)
{
StateRect->assignProperty(list.at(num),"pos",QPoint(i,j));
num++;
}
}
//横线、竖线、原地
num=0;
for(int i=60;i<=540;i+=60)
{
StatePos->assignProperty(list.at(num),"pos",QPoint(60,60));
StateLine1->assignProperty(list.at(num),"pos",QPoint(i,60));
StateLine2->assignProperty(list.at(num),"pos",QPoint(60,i));
num++;
}
//菱形
StateTri->assignProperty(list.at(0),"pos",QPoint(180,60));
StateTri->assignProperty(list.at(1),"pos",QPoint(120,120));
StateTri->assignProperty(list.at(2),"pos",QPoint(240,120));
StateTri->assignProperty(list.at(3),"pos",QPoint(60,180));
StateTri->assignProperty(list.at(4),"pos",QPoint(180,180));
StateTri->assignProperty(list.at(5),"pos",QPoint(300,180));
StateTri->assignProperty(list.at(6),"pos",QPoint(120,240));
StateTri->assignProperty(list.at(7),"pos",QPoint(240,240));
StateTri->assignProperty(list.at(8),"pos",QPoint(180,300));
//创建动画组
QParallelAnimationGroup *group = new QParallelAnimationGroup;
for (int i=0;i<9;i++) {
QPropertyAnimation *anim = new QPropertyAnimation(list[i], "pos");
anim->setDuration(750 + i * 25);
anim->setEasingCurve(QEasingCurve::InOutBack);
group->addAnimation(anim);
}
//父状态添加跳转
(Parent->addTransition(ui->btn_line1,SIGNAL(clicked(bool)),StateLine1))->addAnimation(group);
(Parent->addTransition(ui->btn_line2,SIGNAL(clicked(bool)),StateLine2))->addAnimation(group);
(Parent->addTransition(ui->btn_rect,SIGNAL(clicked(bool)),StateRect))->addAnimation(group);
(Parent->addTransition(ui->btn_center,SIGNAL(clicked(bool)),StatePos))->addAnimation(group);
(Parent->addTransition(ui->btn_tri,SIGNAL(clicked(bool)),StateTri))->addAnimation(group);
//初始化父状态
Parent->setInitialState(StatePos);
//创建状态机
QStateMachine *machine = new QStateMachine();
machine->addState(Parent);
machine->addState(final);
machine->setInitialState(Parent);
machine->start();
}
MainWindow::~MainWindow()
{
delete ui;
}
效果图