Qt第十五章 动画和状态机

news/2024/12/22 19:06:26/

文章目录

  • 动画框架
    • 动画架构
    • 动画框架类
    • QPropertyAnimation
    • 串行动画组QSequentialAnimationGroup
    • 并行动画组QPararallelAnimationGroup
    • QPauseAnimation
    • QTimeLine
    • 窗口动画
      • 下坠效果
      • 抖动效果
      • 透明效果
  • 状态机
    • QState
    • QStateMachine

动画框架

动画架构

在这里插入图片描述

动画框架类

类名描述
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;// 定义属性动画1QPropertyAnimation* pAnm = new QPropertyAnimation(ui->pushButton, "pos");pAnm->setStartValue(QPoint());pAnm->setEndValue(QPoint(300, 400));pAnm->setDuration(2000);pAnm->setEasingCurve(QEasingCurve::Type(40));// 定义属性动画2QPropertyAnimation* 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;// 定义属性动画1QPropertyAnimation* pAnm = new QPropertyAnimation(ui->pushButton, "pos");pAnm->setStartValue(QPoint());pAnm->setEndValue(QPoint(300, 400));pAnm->setDuration(2000);pAnm->setEasingCurve(QEasingCurve::Type(40));// 定义属性动画2QPropertyAnimation* 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();
}

http://www.ppmy.cn/news/1514699.html

相关文章

k8s 进阶实战笔记 | Ingress-traefik(一)

文章目录 traefik认知基本概述基础特性其他ingress对比核心概念和能力 安装部署创建CRD资源RBAC资源创建配置文件部署traefik预期效果 traefik认知 基本概述 ● 官网:https://traefik.cn ● 现代HTTP反向代理、负载均衡工具 ● 它支持多种后台 (Docker, Swarm, Ku…

Android 添加系统服务的实现

和你一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容: 一、前言二、编写AIDL文件三、编写Manager类四、 编写系统服务五、 注册系统服务六、注册Manager七、App调用八、添…

C语言--不可不学的指针

1. 指针是什么 内存是什么? 内存是电脑上特别重要的存储器,计算机中的程序的运行都是在内存中进行的,为了有效使用内存,我们会把内存划分为一个个小的内存单元,比如把4G/8G/16G/32G的内存划分为一个个以字节为单位的空…

鸿蒙(API 12 Beta3版)【DRM Kit 简介】数字版权保护

开发者通过调用DRM Kit(Digital Rights Management Kit,数字版权保护服务)提供的接口可以开发播放器应用,实现数字版权保护的基础操作,如设备证书管理、许可证管理、解密操作等;还可以通过接口参数配置完成…

Python办公自动化smtplib实现自动发送邮件

学好python自动化,走遍天下都不怕!! 今天主要学习如何利用python自动化分析处理数据并以附件形式发送邮箱。需要安装配置python的运行环境,以及电脑支持Excel文件,有可以正常使用的邮箱。还需要用到python的第三方模块…

如何远程连接到AWS EC2实例?

随着越来越多的企业选择云服务来支撑其业务发展,了解如何高效管理云环境中的资源变得尤为重要。本文九河云将指导您完成从本地计算机远程连接到AWS EC2(Elastic Compute Cloud)实例的过程,帮助您轻松进行系统管理、应用程序部署等…

【SpringBoot】优化慢启动应用的用户体验

通过深入分析SpringBoot中WebServer的启动流程,插入自定义的Loading页面展示逻辑,优化软件使用时的用户体验。 背景 Java本身的特点,再加上开发人员能力差,软件开发工程化程度低等等问题,经过一段时间的迭代之后&…

【ACM稳定出版,高录用稳检索】第八届电子信息技术与计算机工程国际学术会议(EITCE 2024,10月18-20)

第八届电子信息技术与计算机工程国际学术会议(EITCE 2024)将于2024年10月18日至20日在中国海口举办。 本次会议旨在汇集全球电子信息技术与计算机工程领域的学者、科研专家及行业实践者,共同探讨该领域的最新研究成果、技术进展与学术动态。会…