Qt第十五章 动画和状态机

动画框架

动画架构

在这里插入图片描述

动画框架类

类名描述
QAbstractAnimation所有动画的基类
QAnimationGroup动画容器类的抽象类
QEasingCurve控制动画的缓和曲线类
QParallelAnimationGroup并行动画容器
QPauseAnimationQSequentialAnimationGroup暂停
QPropertuAnimationQt属性动画
QSequentialAnimationGroup串行动画容器
QTimeLine可控制动画的时间轴类
QVariantAnimation动画类的抽象基类

QPropertyAnimation

void Widget::propertyAnima()
{
    QPropertyAnimation* propAnma = new QPropertyAnimation(ui->pushButton, "pos", this);
    propAnma->setStartValue(QPoint());
    propAnma->setEndValue(QPoint(500, 400));

    propAnma->setKeyValueAt(0.3, QPoint(600, 0)); // 在0.3总时间的地方设置个中间位置
    propAnma->setKeyValueAt(0.6, QPoint(0, 200));

    propAnma->setDuration(3000);

    propAnma->start();

    propAnma->setLoopCount(2); // 动画执行2遍
    // propAnma->setLoopCount(-1); // 设置一直执行

    propAnma->setEasingCurve(QEasingCurve::Type(30)); // 设置缓和曲线,第30号OutElastic效果
    
    propAnma->setDirection(QPropertyAnimation::Backward); // 也可以设置从后往前播放
}

在这里插入图片描述

串行动画组QSequentialAnimationGroup

void Widget::seqAnimaGroup()
{
    // 定义串行动画组
    QSequentialAnimationGroup* seqAnmGroup = new QSequentialAnimationGroup;
    // 定义属性动画1
    QPropertyAnimation* pAnm = new QPropertyAnimation(ui->pushButton, "pos");
    pAnm->setStartValue(QPoint());
    pAnm->setEndValue(QPoint(300, 400));
    pAnm->setDuration(2000);
    pAnm->setEasingCurve(QEasingCurve::Type(40));
    // 定义属性动画2
    QPropertyAnimation* pAnm2 = new QPropertyAnimation(ui->pushButton, "size");
    pAnm2->setStartValue(QSize(20, 100));
    pAnm2->setEndValue(QSize(100, 20));
    pAnm2->setDuration(2000);
    pAnm2->setEasingCurve(QEasingCurve::Type(40));
    // 把属性动画添加到动画组
    seqAnmGroup->addAnimation(pAnm);
    seqAnmGroup->addPause(3000); // 设置暂停时间
    seqAnmGroup->addAnimation(pAnm2);
    // 开始动画
    seqAnmGroup->start();
}

在这里插入图片描述

并行动画组QPararallelAnimationGroup

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f66caee904cb43f18424370016238c83.gif

void Widget::praAnmGroup()
{
    // 定义并行动画组
    QParallelAnimationGroup* prAnmGroup = new QParallelAnimationGroup;
    // 定义属性动画1
    QPropertyAnimation* pAnm = new QPropertyAnimation(ui->pushButton, "pos");
    pAnm->setStartValue(QPoint());
    pAnm->setEndValue(QPoint(300, 400));
    pAnm->setDuration(2000);
    pAnm->setEasingCurve(QEasingCurve::Type(40));
    // 定义属性动画2
    QPropertyAnimation* pAnm2 = new QPropertyAnimation(ui->pushButton, "size");
    pAnm2->setStartValue(QSize(20, 100));
    pAnm2->setEndValue(QSize(100, 20));
    pAnm2->setDuration(2000);
    pAnm2->setEasingCurve(QEasingCurve::Type(40));
    // 把属性动画添加到动画组
    prAnmGroup->addAnimation(pAnm);
    prAnmGroup->addAnimation(pAnm2);
    // 开始动画
    prAnmGroup->start();
}

在这里插入图片描述

QPauseAnimation

    QPauseAnimation* pause = new QPauseAnimation(1000);
    prAnmGroup->addAnimation(pAnm);
    prAnmGroup->addAnimation(pause);
    prAnmGroup->addAnimation(pAnm2);

QTimeLine

void Widget::TimeLineAnm()
{
    QTimeLine* tl = new QTimeLine(3000, this);
    // 连接信号与槽
    connect(tl, &QTimeLine::frameChanged, [=](int var) {
        ui->pushButton->move(0, var); // var是当前移动到第几帧
        ui->progressBar->setValue(var);
    });
    tl->setFrameRange(0, 180); // 设置时间线范围,在第0帧和第180帧之间
    tl->setLoopCount(0); // 无限循环,和属性动画的无限循环不一样
    tl->start();
    tl->setEasingCurve(QEasingCurve::OutBounce); // 设置缓和曲线
}

在这里插入图片描述

窗口动画

下坠效果

创建一个pushbutton连接信号与槽,槽函数代码

void Widget::on_pushButton_2_clicked()
{
    // 下坠,把窗口当做对象
    QPropertyAnimation* anm = new QPropertyAnimation(this, "geometry", this);
    // 设置起始位置
    QRect rect = geometry();
    anm->setStartValue(rect);
    // 设置结束位置
    rect.moveBottom(rect.bottom() + 100);
    anm->setEndValue(rect);
    // 设置缓和曲线
    anm->setEasingCurve(QEasingCurve::OutElastic);
    anm->setDuration(2000); // 设置时长
    anm->start();
}

在这里插入图片描述

抖动效果

void Widget::on_pushButton_3_clicked()
{
    // 抖动
    QPropertyAnimation* anm = new QPropertyAnimation(this, "pos", this);
    // 获取初始位置
    QPoint start = pos();
    // 第一个状态往左移动
    anm->setStartValue(start + QPoint(-5, 0));
    // 第二个状态往右移动
    anm->setKeyValueAt(0.25, start + QPoint(5, 0));
    // 第三个状态往上移动
    anm->setKeyValueAt(0.5, start + QPoint(0, -5));
    // 第四个状态往下移动
    anm->setKeyValueAt(0.75, start + QPoint(0, 5));
    // 返回初始位置
    anm->setEndValue(start);
    anm->setDuration(100);
    anm->setLoopCount(3); // 抖3下
    anm->start();
}

在这里插入图片描述

透明效果

void Widget::on_pushButton_4_clicked()
{
    // 透明
    QPropertyAnimation* anm = new QPropertyAnimation(this, "windowOpacity", this);
    anm->setStartValue(1);
    anm->setKeyValueAt(0.9, 0);
    anm->setEndValue(1);
    anm->setEasingCurve(QEasingCurve::Linear);
    anm->setDuration(3000);
    anm->start();
}

在这里插入图片描述

状态机

cmakelist配置(在原来的基础上修改添加,其他的不变)

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets StateMachine)
target_link_libraries(animation PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt6::StateMachine)

QState

QStateMachine

void Widget::stateM()
{
    QStateMachine* stm = new QStateMachine(this);
    // 设置3个状态
    QState* st1 = new QState;
    st1->assignProperty(ui->pushButton, "text", QString("state1"));
    QState* st2 = new QState;
    st2->assignProperty(ui->pushButton, "size", QSize(200, 100));
    QState* st3 = new QState;
    st3->assignProperty(ui->pushButton, "styleSheet", QString("QPushButton#pushButton{background: green}"));
    // 设置改变信号
    st1->addTransition(ui->pushButton, &QPushButton::clicked, st2);
    st2->addTransition(ui->pushButton, &QPushButton::clicked, st3);
    st3->addTransition(ui->pushButton, &QPushButton::clicked, st1);
    // 加入状态机
    stm->addState(st1);
    stm->addState(st2);
    stm->addState(st3);
    // 设置初始状态
    stm->setInitialState(st1);
    stm->start();
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个使用 Qt 动画类和状态机实现的等待动画示例: 首先,创建一个新的 Qt Widgets 应用程序项目,然后在主窗口的 UI 界面中添加一个 QLabel 控件,用于显示等待动画。 在头文件中,包含如下的 Qt 类: ```cpp #include <QWidget> #include <QStateMachine> #include <QState> #include <QPropertyAnimation> ``` 接着,在主窗口的构造函数中初始化状态机动画,并将它们连接起来。示例代码如下: ```cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 初始化状态机 QStateMachine *stateMachine = new QStateMachine(this); // 创建两个状态 QState *state1 = new QState(); QState *state2 = new QState(); // 添加状态到状态机 stateMachine->addState(state1); stateMachine->addState(state2); // 设置初始状态 stateMachine->setInitialState(state1); // 创建动画对象 QPropertyAnimation *animation = new QPropertyAnimation(ui->label, "text"); animation->setDuration(2000); // 动画持续时间 2 秒钟 animation->setStartValue(""); animation->setEndValue("Loading..."); // 将动画对象添加到状态机的状态转换中 state1->addTransition(ui->startButton, &QPushButton::clicked, state2); state2->addTransition(ui->stopButton, &QPushButton::clicked, state1); state1->addAnimation(animation); state2->addAnimation(animation); // 启动状态机 stateMachine->start(); } ``` 在上面的代码中,我们创建了一个 QStateMachine 类型的状态机对象,并创建了两个状态 state1 和 state2。我们将 QLabel 控件的文本属性与 QPropertyAnimation 类型的动画对象的属性 text 相关联,并设置了动画的持续时间为 2 秒钟。然后,我们将动画对象添加到状态机的状态转换中,并启动状态机。 最后,在主窗口的析构函数中,删除状态机动画对象,示例代码如下: ```cpp MainWindow::~MainWindow() { delete ui; delete stateMachine; delete animation; } ``` 运行程序,点击 Start 按钮,即可看到等待动画效果。点击 Stop 按钮,动画会停止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yerennuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值