Qt第十五章 动画和状态机

news2024/9/21 14:43:12

文章目录

  • 动画框架
    • 动画架构
    • 动画框架类
    • 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;
    // 定义属性动画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();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字符串金额转换,字符串手机号屏蔽,身份证信息查看,敏感词替换

2135 在发票上面该写成零佰零拾零万贰仟壹佰叁拾伍元 我们用逆推法可以写成零零零贰壹叁伍->贰壹叁伍->2135 1.遍历获取到每一个数字,然后把大写放到数组里面,将数字当作索引,在数组里面查找大写 package stringdemo;import java.uti…

传输层安全性 ——TLS(Transport Layer Security)简介

TLS(Transport Layer Security)是一种广泛使用的安全协议,旨在确保互联网通信的隐私性和数据完整性。它是SSL(Secure Sockets Layer)的继任者,最初版本于1999年发布,最新版本是TLS 1.3。 TLS 握手为每个通信会话建立一个密码套件密码套件是一组算法,其中指定了一些细节…

如何轻松获取麒麟操作系统架构信息?

如何轻松获取麒麟操作系统架构信息? 一、使用uname -a命令二、用arch命令三、示例输出 💖The Begin💖点点关注,收藏不迷路💖 在使用麒麟操作系统(Kylin OS)时,了解系统的架构信息对于…

stm32单片机学习 - stm32 的命名规则

STM32命名规则: 以STM 32 F 103 C 8 T 6 A xxx为例:

动手学深度学习(pytorch)学习记录9-图像分类数据集之Fashion-MNIST[学习记录]

注:本代码在jupyter notebook上运行 封面图片来源 Fashion-MNIST是一个广泛使用的图像数据集,主要用于机器学习算法的基准测试,特别是图像分类和识别任务。Fashion-MNIST由德国的时尚科技公司Zalando旗下的研究部门提供。作为MNIST手写数字集…

Java并发类API——CompletionService

CompletionService 是 Java 中 java.util.concurrent 包的一部分,用于管理并发任务的执行,并以完成的顺序提供结果。它结合了线程池和阻塞队列的功能,用于提交任务并按照任务完成的顺序来检索结果,而不是按照任务提交的顺序。 接…

uni-app--》打造个性化壁纸预览应用平台(二)

🏙️作者简介:大家好,我是亦世凡华、渴望知识储备自己的一名前端工程师 🌄个人主页:亦世凡华、 🌆系列专栏:uni-app 🌇座右铭:人生亦可燃烧,亦可腐败&#xf…

python语言day7 函数式编程 面向对象编程

Java 函数式编程_java函数式编程-CSDN博客 25.Java函数式编程-CSDN博客 函数式编程: 通过调用函数send_email(),完成业务需求。将具体的业务需求封装成一个函数这样的一种解决问题的思想称它为函数式编程。 在java中本来没有函数的概念,因为…

指针详解

目录 1. 内存 2. 编址​编辑 3. 指针变量和地址 1)取地址操作符(&) 2)指针变量 3)指针类型 4)解引用操作符 4. 指针变量的大小 5. 指针变量类型的意义 1)指针的解引用 6. 指针 -…

Java使用XXL-Job-Admin创建和管理调度任务的指南

文章目录 一、调度中心添加任务的基本方法二、配置文件中的任务配置三、创建并调用调度任务的客户端四、配置RestTemplate 总结 在日常开发中,我们经常需要处理各种定时任务,而XXL-Job作为一款强大的分布式任务调度平台,为我们提供了简单易用…

进程与线程(6)

有名管道: 目录 有名管道: 1.创建(mkfifo): 2。打开(open): 3.读写(read /write): 4.关闭(close): 5.卸…

presto高级用法(grouping、grouping sets)

目录 准备工作: 在hive中建表 在presto中计算 分解式 按照城市分组 统计人数 按照性别分组 统计人数 ​编辑 按照爱好分组 统计人数 ​编辑 按照城市和性别分组 统计人数 按照城市和爱好分组 统计人数 按照性别和爱好分组 统计人数 按照城市和性别还有…

【Qt开发】创建并打开子窗口(QWidget)的注意事项 禁止其他窗口点击、隐藏窗口、子窗口不退出的配置和解决方案

【Qt开发】创建并打开子窗口(QWidget)的注意事项 禁止其他窗口点击、隐藏窗口、子窗口不退出的配置和解决方案 文章目录 新建QWidget测试注意事项不要用多线程方式运行子窗口不要在打开子窗口后用阻塞死等不要用临时变量定义子窗口 禁止其他窗口的点击隐…

【Qt】常用控件QPushButton

常用控件QPushButton QWidget中涉及的各种属性/函数/使用方法,对Qt中的各种控件都是有效的。 QPushButton继承自QAbstractButton。这个类是抽象类,是其他按钮的父类。 QAbstractButton中和QPushButton相关性比较大的属性。 属性说明 text 按钮中的⽂本…

Vue中下载内容为word文档

1.使用 html-docx-js:这是一个将 HTML 转换为 Word 文档的库。 2. 利用 Blob 和 FileSaver.js:创建并下载生成的 Word 文档。 在 Vue.js 中实现步骤如下: 1. npm 安装 html-docx-js 和 file-saver npm install html-docx-js npm install file-saver2.…

CAS-ViT:面向高效移动应用的卷积加性自注意力视觉Transformer

摘要 https://arxiv.org/pdf/2408.03703 视觉转换器(Vision Transformers,ViTs)以其标记混合器强大的全局上下文能力,在神经网络领域取得了革命性的进展。然而,尽管以往的工作已做出相当大的努力,但成对标…

终于来了!中国首个接入大模型的Linux开源操作系统正式发布!

在AI飞速发展的今天,谁不希望自己的电脑里住着一个AI助手,我们动动嘴皮子就能指挥电脑干活,省时省力?但是Windows Copilot锁了区,很多用户只能“望洋兴叹”。 而现在,国产站出来了,说我们也有A…

Python常用的模块

一、logging模块 一)日志级别 critical50 error40 waring30 info20 debug10 notset0 二)默认的日志级别是waring(30),默认的输出目标是终端 logging输出的目标有两种:1、终端;2、文件 高于warn…

如何查看麒麟系统下的CPU信息

如何查看麒麟系统下的CPU信息 一、使用lscpu命令二、使用cat /proc/cpuinfo命令 💖The Begin💖点点关注,收藏不迷路💖 在麒麟(Kylin)Linux系统中,了解CPU的详细信息对于系统性能调优、故障诊断以…

转债违约,是实体经济高质量发展的一大步?

8月14日,岭南股份公告其发行的可转债无法按期兑付,出现实质违约。8月16日,证券时报发表了一篇“雄文”《国企可转债的刚兑信仰该放下了》,引爆了舆论。 文章内容总结下,就是对投资者一顿批评教育,批评投资者…