type
status
date
slug
summary
tags
category
icon
password
Email
落絮无声春堕泪,行云有影月含羞。——吴文英《浣溪沙》
文章首发于我的个人博客:欢迎大佬们来逛逛
Qt学习的项目地址源码:
Qt-code
luumod • Updated 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的属性,因此我们对他们添加动画效果。
注意到,我们在下面的案例中还设置了一个
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
类提供了一个分层的有限状态机状态机来添加多种状态,来实现多种状态的切换。
其实就是相当于属性动画与动画组的效果,状态机就是串行并行动画组,状态就是每一个属性动画
案例:按钮状态切换
一个按钮会切换成不同的三种状态:播放,暂停,停止。
案例:两个图片之间的切换
案例:状态机与属性动画相结合使用
这里使用了父状态这一概念。多个子状态可以设置一个共同的父状态,然后再对父状态执行一些操作。
- 作者:Yuleo
- 链接:https://www.helloylh.com/article/qt17
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。