编程学习
Qt学习17:动画与状态机
00 分钟
2023-7-28
2023-11-23
type
status
date
slug
summary
tags
category
icon
password
Email
💓
落絮无声春堕泪,行云有影月含羞。——吴文英《浣溪沙》
💡
文章首发于我的个人博客:欢迎大佬们来逛逛
🔆
Qt学习的项目地址源码:
Qt-code
luumodUpdated Jul 3, 2023

Qt动画框架旨在为创建动画平滑的GUI提供了一种简单的方法。

动画框架类

这些类提供了用于创建简单的和复杂的动画框架。
类名
描述
QAbstractAnimation
所有动画类的基类
QPropertyAnimation
Qt属性动画
QAnimationGroup
动画容器类的抽象类
QParallelAnimationGroup
并行动画容器
QSequentialAnimationGroup
串行动画容器
QPauseAnimation
暂停
QTimeLine
可控制动画的时间轴类
QVariantAnimation
动画类的抽象基类
QEasingCurve
控制动画的缓和曲线类

QPropertyAnimation

此类提供了最简单的创建动画的方式:对一个简单的控件的属性进行操作。
构造函数:
  • target:控件对象。
  • propertyName:此对象的属性名
  • 父对象。
常用API:
  • setPropertyName:设置其控制的属性名
  • setTargetObject:设置其控制的对象。
  • setEasingCurve:设置缓和曲线样式。
  • setDuration:设置动画时间间隔。
  • start:开始播放动画。
  • setStartValue:设置动画的基础值
  • setEndValue:设置动画的结束值。
  • setKeyValueAt:在某个过程进行插值中间值
所谓动画其实就是 从 开始值 到 (中间值) 再到结束值 的过程,因此上面三个setvalue的函数是设置动画效果的关键,一定不能少
另外你指定了什么样的属性,setValue里面的参数就是什么类型的,例如:
  • pos:QPoint类型
  • windowOpcacity(透明度):double

例子:按钮的简单移动。
对象和属性名和QObject实例被传递给构造函数。 你也可以手动设置 他们两个。

缓和曲线

enum QEasingCurve::Type
它拥有四十种不同的样式。
可以通过来设置缓和曲线。

案例:对QWidget设置动画效果

我们使用QPropertyAnimation 来设置窗口的不同的属性:pos,windowOpacity,自定义颜色改变样式。
关于一些对象的属性,可以打开帮助文档查看:
这是QWidget的属性,其中我们无法对const的属性进行操作。
可以看到 pos 和 windowOpacity不是const的属性,因此我们对他们添加动画效果。
notion image
注意到,我们在下面的案例中还设置了一个styleSheetAnimation ,即我们想要对QWidget 的 styleSheet施行动画效果,但是我们注意到QWidget的属性中并没有此属性!
因此我们使用自定义重写的方式来进行:
我们重写 QPropertyAnimation 这个类,其中有一个虚函数叫做:updateState
当当前值发生变化的时候,就会调用这个虚函数,其中value是更新后的新值
关于我们这个类想要实现什么,看一下具体的实现就知道了:我们想要对QWidget设置样式表,并且更改其background-color 使其一直更换颜色
具体步骤:
  • 分别创建三个不同的属性动画
  • 分别对三个不同的属性动画进行设置值,持续时间,缓和曲线
  • QSequentialAnimationGroup是串行动画组,其按照addAnimation顺序依次执行动画
  • QParallelAnimationGroup是并行动画组,他会并行执行全部动画效果。

QSequentialAnimationGroup

串行动画组,可以把每一个动画添加到其里面,然后再执行动画的依次播放
常用API:
  • addAnimation:添加属性动画,注意添加的顺序就是执行的顺序。
  • group:获取动画执行时的状态。QAbstractAnimation::State:: Stopped/Running/Pasusing 有三个状态:停止,运行和暂停
  • direction:获取动画执行的方向:QAbstractAnimation::Direction::Forward/backward正向和反向。
  • addPause:添加暂停,传递的是一个毫秒数,即在第几毫秒的时候触发一次暂停。注意:暂停被认为是一种特殊类型的动画,因此animationCount将增加1。
  • clear:清除动画组所有动画

例子:点击按钮后以动画形式顺序弹出其余三个按钮。

QParallelAnimationGroup

此类与上面的串行动画组相反,他是并行的,即同时执行所有的属性动画。
其API与上面是一致的,唯一的区别就是他是并行的。
可以把上面的案例中的QSequentialAnimationGroup 改为QParallelAnimationGroup来测试结果。

QTimeLine

QTimeLine类提供了用于控制动画的时间轴,通常用于通过定期调用一个槽函数来动画一个GUI控件。
常用API函数:
  • setFrameRange:设置范围。
  • setEasingCurve:设置缓和曲线
  • setLoopCount:设置动画循环次数,0为无限循环
  • start:开始动画。
可以将某一个控件与其相连接。
QTimeLine有一个frameChanged的信号,即在指定时间内的值发生变化时就会触发,并且有一个 int 类型的参数可以传递为其他对象的值。
如下我们将其信号与 进度条QProgressBar 控 件的setValue相关联,使得可以间接的改变进度条的值。
调用start(),QTimelL ine将进入运行状态,并开始定期(固定的时间间隔)发出frameChanged()信号,部件的连接属性的值以稳定的速度从帧范围的下限到上限增长。可以通过调用setJpdateIlnterval()指定更新间隔。当完成后,QTimeLine进入NotRunning 状态,并发出finished()信号。

案例:窗口动画(下坠、抖动、透明度)

下坠效果

抖动效果

点击按钮是窗口抖动,直接往四个方向进行插值即可,setLoopCount来设置属性动画的循环次数。

透明


状态机

QState

QState是状态机框架的一部分。
QState的作用很简单,简单来说就是可以由一个状态切换为另一个状态,进而实现动画的效果,只不过这是状态的切换。
QState类为QStateMachine提供了一个通用状态。
常用API函数:
  • addTransition:函数的作用是添加一个转换
  • assignProperty:函数用于定义对进入状态时应执行的属性赋值
  • removeTransition:函数的作用是删除转换。
  • transitions:函数的作用是返回状态的传出转换。
顶级状态必须传递一个QStateMachine对象作为它们的父状态,或者使用QStateMachine::addState()添加到状态机。

QStateMachine

QStateMachine类提供了一个分层的有限状态机
状态机来添加多种状态,来实现多种状态的切换。
其实就是相当于属性动画与动画组的效果,状态机就是串行并行动画组,状态就是每一个属性动画

案例:按钮状态切换

一个按钮会切换成不同的三种状态:播放,暂停,停止。

案例:两个图片之间的切换


案例:状态机与属性动画相结合使用

这里使用了父状态这一概念。多个子状态可以设置一个共同的父状态,然后再对父状态执行一些操作。

评论
  • Twikoo
  • Valine