简述
QTimeLine 类提供了用于控制动画的时间轴,通常用于通过定期调用一个槽函数来动画一个 GUI 控件。
相信了解动画的人对帧应该不陌生,可以把一个动画想象成由很多张静态画面组成,而每一个画面就是一帧图像。每隔一定时间间隔就显示一帧图像,当该间隔较短时,人眼就感觉不出来了,觉得看到的是连续的影像。
详细说明
可以通过将持续时间(毫秒)传递给 QTimeLine 的构造函数来构建 timeline,timeline 的持续时间描述动画将运行多长时间。然后通过调用 setFrameRange() 设置合适的帧范围。最后,将 frameChanged() 信号连接到想要动画的部件中的合适的槽函数(例如,QProgressBar 中的 setValue())。
调用 start(),QTimeLine 将进入运行状态,并开始定期(固定的时间间隔)发出 frameChanged() 信号,部件的连接属性的值以稳定的速度从帧范围的下限到上限增长。可以通过调用 setUpdateInterval() 指定更新间隔。当完成后,QTimeLine 进入 NotRunning 状态,并发出 finished() 信号。
示例:
QProgressBar *progressBar = new QProgressBar(this);
progressBar->setRange(0, 100);
// 构造帧范围为 0 - 100,持续时间为 1000 毫秒(1 秒)的 timeline
QTimeLine *timeLine = new QTimeLine(1000, this);
timeLine->setFrameRange(0, 100);
connect(timeLine, SIGNAL(frameChanged(int)), progressBar, SLOT(setValue(int)));
// 输出当前帧数
connect(timeLine, &QTimeLine::frameChanged, [=](int value) {
qDebug() << value;
});
// 启动进度条动画
QPushButton *startButton = new QPushButton(this);
startButton->setText(QString::fromLocal8Bit("开始"));
connect(startButton, SIGNAL(clicked()), timeLine, SLOT(start()));
输出如下:
2 4 8 12 17 24 30 37 44 51 59 66 73 79 84 89 93 96 98 99 100
默认情况下,timeline 运行一次,从开始到结束,如果要从头开始重新启动,必须再次调用 start()。要使 timeline 循环,可以调用 setLoopCount(),传递 timeline 在完成之前应运行的次数(0 表示无限循环)。也可以通过调用 setDirection() 来更改方向,使 timeline 向后运行。还可以通过调用 setPaused() 在运行时暂停和取消暂停 timeline。对于交互式控制,提供 setCurrentTime() 函数,直接设置 timeline 的时间位置。虽然在 NotRunning 状态下最有用(例如,连接到 QSlider 中的 valueChanged() 信号),但是该函数可以在任何时候被调用。
状态
枚举 QTimeLine::State:
该枚举描述 timeline 的状态。
常量 | 值 | 描述 |
---|---|---|
QTimeLine::NotRunning | 0 | timeline 未运行。这是 QTimeLine 的初始状态,并且状态在 QTimeLine 完成时重新进入。当前时间,帧和值保持不变,直到调用 setCurrentTime(),或者通过调用 start() 启动 timeline 。 |
QTimeLine::Paused | 1 | timeline 暂停(即,暂时中止),调用 setPaused(false) 将恢复 timeline 活动。 |
QTimeLine::Running | 2 | timeline 正在运行。当控制位于事件循环中,QTimeLine 将定期更新其当前时间,在适当时发出 valueChanged() 和 frameChanged() 信号。 |
一开始 QTimeLine 处于 NotRunning 状态,在调用 start() 之后进入 Running 状态,运行过程中,可以进行暂停或者停止。
需要注意,暂停和停止的概念:
- stop():停止 timeline,QTimeLine 将进入 NotRunning 状态。
- setPaused(true):暂停 timeline,QTimeLine 将进入 Paused 状态。
在暂停或停止以后,可以通过调用 resume()、setPaused(false)、start() 再次运行,再来看看他们的区别:
- resume():从 timeline 的当前时间恢复,QTimeLine 将重新进入 Running 状态,一旦进入事件循环,它将更新其当前时间、帧和值。与 start() 相反,在恢复之前,该函数不会重新启动 timeline。
- setPaused(false):和 resume() 相同。
start():启动 timeline,QTimeLine 将进入运行状态,一旦它进入事件循环,将在定期间隔时更新其当前时间、帧和值。默认间隔为 40 毫秒(即每秒 25 次)。可以通过调用 setUpdateInterval() 来更改更新间隔。
timeline 将从位置 0 处开始,或者如果是相反方向,则从结束位置开始。如果需要在不重新启动的情况下恢复已停止的时间轴,可以调用 resume()。
timeline 的状态可以根据 state() 函数来获取,当状态改变时,会发射 stateChanged() 信号。
方向
枚举 QTimeLine::Direction:
该枚举描述 timeline 在 Running 状态时的方向。
常量 | 值 | 描述 |
---|---|---|
QTimeLine::Forward | 0 | timeline 的当前时间随时间增加(即,从 0 移动到结束/持续时间)。 |
QTimeLine::Backward | 1 | timeline 的当前时间随时间减小(即,从结束/持续时间移动到 0)。 |
默认情况下,此属性为 Forward,时间从 0 到 timeline 的 duration(持续时间)。可以使用 setDirection() 来进行改变。
曲线形状
框架接口对标准窗口部件很有用,但 QTimeLine 可用于控制任何类型的动画。QTimeLine 的核心在于 valueForTime() 函数,该函数在给定时间内生成 0 和 1 之间的值。此值通常用于描述动画的步骤,其中 0 是动画的第一步,1 是最后一步。运行时,QTimeLine 通过调用 valueForTime() 生成 0 和 1 之间的值并发出 valueChanged() 信号。默认情况下,valueForTime() 应用插值算法生成这些值,可以通过调用 setCurveShape() 从一组预定义的时间轴算法中进行选择。
枚举 QTimeLine::CurveShape:
该枚举描述了 QTimeLine 的值曲线的默认形状。默认的形状是 EaseInOutCurve,曲线定义了值和 timeline 之间的关系。
常量 | 值 | 描述 |
---|---|---|
QTimeLine::EaseInCurve | 0 | 值开始缓慢增长,然后迅速增加。 |
QTimeLine::EaseOutCurve | 1 | 值开始稳定增长,然后缓慢结束。 |
QTimeLine::EaseInOutCurve | 2 | 值开始缓慢增长,然后稳定增长,然后再次缓慢增长。 |
QTimeLine::LinearCurve | 3 | 值线性式增长(例如,如果持续时间是 1000ms,则在时间 500ms 处的值是 0.5)。 |
QTimeLine::SineCurve | 4 | 值正弦式增长 |
QTimeLine::CosineCurve | 5 | 值余弦式增长 |
注意:默认情况下,QTimeLine 使用 EaseInOut 曲线形状,它提供一个慢慢增长,然后稳定增长,最终慢慢增长的值。对于自定义时间轴,可以重新实现 valueForTime(),在这种情况下,QTimeLine 的 curveShape 属性被忽略。