一、描述
时间线。此类最常用于通过定期调用槽函数来为 GUI 控件设置动画。
progressBar = new QProgressBar(this);
progressBar->setRange(0, 100);
//构建帧范围为 0 - 100 的 1 秒时间线
QTimeLine *timeLine = new QTimeLine(1000, this);
timeLine->setFrameRange(0, 100);
connect(timeLine, &QTimeLine::frameChanged, progressBar, &QProgressBar::setValue);
//单击按钮将启动进度条动画
pushButton = new QPushButton(tr("Start animation"), this);
connect(pushButton, &QPushButton::clicked, timeLine, &QTimeLine::start);
通过将其持续时间(毫秒)传递给 QTimeLine 的构造函数来构建时间线。时间线的持续时间描述了动画将运行多长时间。当继续调用 start() 时,QTimeLine 将进入运行状态,并开始定期发出 frameChanged()。
QTimeLine 的核心在于 valueForTime() 函数,它在给定的时间内生成 0 到 1 之间的值。该值通常用于描述动画的步骤,其中 0 是动画的第一步,1 是最后一步。运行时,QTimeLine 通过调用 valueForTime() 并发出 valueChanged() 生成 0 到 1 之间的值。默认情况下,valueForTime() 应用插值算法来生成这些值。
二、类型成员
1、enum QTimeLine::Direction:此枚举描述处于运行状态时时间线的方向。
- Forward:时间线的当前时间随着时间的推移而增加(即从 0 向结束/持续时间移动)。
- Backward:时间线的当前时间随时间递减(即从结束/持续时间移向 0)。
2、enum QTimeLine::State:这个枚举描述了时间线的状态。
- NotRunning:时间线没有运行。这是QTimeLine的初始状态,完成后重新进入QTimeLine状态。当前时间、帧和值保持不变,直到调用 setCurrentTime() 或通过调用 start() 启动时间线。
- Paused:时间线暂停(即暂时暂停)。调用 setPaused(false) 将恢复时间线活动。
- Running:时间线正在运行。当控制处于事件循环中时,QTimeLine 将定期更新其当前时间,在适当的时候发出 valueChanged() 和 frameChanged()。
三、属性成员
1、currentTime : int
此属性保存时间线的当前时间。
当 QTimeLine 处于 Running 状态时,此值会作为时间线的持续时间和方向的函数不断更新。 否则,它是最后一次调用 stop() 时的当前值,或者是 setCurrentTime() 设置的值。
2、direction : Direction
当 QTimeLine 处于 Running 状态时,此属性保存时间线的方向。默认为 Forward。
3、duration : int
此属性保存时间线的总持续时间(毫秒)。
默认情况下,此值为 1000(即 1 秒),但可以通过将持续时间传递给 QTimeLine 的构造函数或调用 setDuration() 来更改此值。 持续时间必须大于 0。
注意:更改持续时间不会导致当前时间重置为零或新的持续时间。还需要使用所需的值调用 setCurrentTime()。
4、easingCurve : QEasingCurve
指定时间线将使用的缓和曲线。如果重新实现 valueForTime(),则忽略此值。
5、loopCount : int
此属性保存时间线在完成之前应该循环的次数。默认为 1。
为 0 意味着时间线将永远循环。
6、updateInterval : int
此属性保存每次 QTimeLine 更新 currentTime 的间隔(毫秒)。
更新 currentTime 时,如果当前值发生变化,QTimeLine 将发出 valueChanged(),如果帧发生变化,则发出 frameChanged()。
默认为 40 毫秒,对应于每秒 25 次更新的速率。
四、成员函数
1、【private signal】void finished()
当 QTimeLine 完成(即到达其时间线的末尾)时发出此信号,并且不会循环。
私有信号。 它可以用于信号连接,但不能由用户发射。
2、【private signal】void frameChanged(int frame)
QTimeLine 在处于 Running 状态时帧改变则会发出此信号。
3、void resume()
从当前时间恢复时间线。QTimeLine 会重新进入 Running 状态,一旦进入事件循环,就会定期更新当前的时间、帧和值。
与 start() 相比,此函数在恢复之前不会重新启动时间线。
4、void setPaused(bool paused)
如果 paused 为 true,则时间线暂停,导致 QTimeLine 进入 Paused 状态。 在调用 start() 或 setPaused(false) 之前,不会发出更新信号。
如果 paused 为 false,则时间线将恢复并从其离开的地方继续。
5、void start()
启动时间线。QTimeLine 会进入 Running 状态,一旦进入事件循环,就会定期更新其当前时间、帧和值。
6、【private signal】void stateChanged(QTimeLine::State newState)
每当 QTimeLine 的状态发生变化时,就会发出此信号。 新状态是 newState。
7、void stop()
停止时间线,导致 QTimeLine 进入 NotRunning 状态。
8、void toggleDirection()
切换时间线的方向。如果方向为 Forward,则变为 Backward,反之亦然。
9、【private signal】void valueChanged(qreal value)
QTimeLine 在处于运行状态时会定期发出此信号,但前提是当前值发生变化。value 是当前值。 value 是一个介于 0.0 和 1.0 之间的数字
10、int currentFrame()
返回当前时间对应的帧。
11、qreal currentValue()
返回当前时间对应的值。
12、int endFrame() / int startFrame()
返回结束帧 / 起始帧,即时间轴结束 / 开始对应的帧(即当前值为 1 / 0的帧)。
13、int frameForTime(int msec)
返回时间毫秒对应的帧。该值是根据 valueForTime() 返回的值,使用开始帧和结束帧的线性插值计算得出的。
14、void setEndFrame(int frame) / void setStartFrame(int frame)
设置结束帧(即当前值为1的帧)/ 起始帧(即当前值为0的帧)。
15、void setFrameRange(int startFrame, int endFrame)
设置帧范围。
当处于 Running 状态时,QTimeLine 还会在帧更改时发出 frameChanged() 信号。
16、QTimeLine::State state()
返回时间线的状态。
17、qreal valueForTime(int msec)
返回时间 msec 的时间线值。返回值因曲线形状而异,始终介于 0 和 1 之间。如果 msec 为 0,则默认实现始终返回 0。
重新实现此功能可自定义曲线形状。
五、使用示例
QTimeLine * timeLine = new QTimeLine(1000,this);
timeLine->setDuration(3000);
timeLine->setFrameRange(100, 700);
timeLine->setEasingCurve(QEasingCurve::OutBounce);
connect(timeLine, &QTimeLine::frameChanged, [=](int value)
{
ui->w->setFixWidth(value);
});
timeLine->start();
这段代码和下面这段设置动画的代码效果一样:
QPropertyAnimation * animation = new QPropertyAnimation(ui->w, "Width");
animation->setDuration(3000);
animation->setStartValue(100);
animation->setEndValue(700);
animation->setEasingCurve(QEasingCurve::OutBounce);
animation->start(QAbstractAnimation::DeleteWhenStopped);