Qt之QTimeLine

简述

QTimeLine 类提供了用于控制动画的时间轴通常用于通过定期调用一个槽函数来动画一个 GUI 控件。

相信了解动画的人对帧应该不陌生可以把一个动画想象成由很多张静态画面组成而每一个画面就是一帧图像。每隔一定时间间隔就显示一帧图像当该间隔较短时人眼就感觉不出来了觉得看到的是连续的影像。

详细说明

可以通过将持续时间毫秒传递给 QTimeLine 的构造函数来构建 timelinetimeline 的持续时间描述动画将运行多长时间。然后通过调用 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::NotRunning0timeline 未运行。这是 QTimeLine 的初始状态并且状态在 QTimeLine 完成时重新进入。当前时间帧和值保持不变直到调用 setCurrentTime()或者通过调用 start() 启动 timeline 。
QTimeLine::Paused1timeline 暂停即暂时中止调用 setPaused(false) 将恢复 timeline 活动。
QTimeLine::Running2timeline 正在运行。当控制位于事件循环中QTimeLine 将定期更新其当前时间在适当时发出 valueChanged() 和 frameChanged() 信号。

一开始 QTimeLine 处于 NotRunning 状态在调用 start() 之后进入 Running 状态运行过程中可以进行暂停或者停止。

需要注意暂停和停止的概念

  • stop()停止 timelineQTimeLine 将进入 NotRunning 状态。
  • setPaused(true)暂停 timelineQTimeLine 将进入 Paused 状态。

在暂停或停止以后可以通过调用 resume()、setPaused(false)、start() 再次运行再来看看他们的区别

  • resume()从 timeline 的当前时间恢复QTimeLine 将重新进入 Running 状态一旦进入事件循环它将更新其当前时间、帧和值。与 start() 相反在恢复之前该函数不会重新启动 timeline。
  • setPaused(false)和 resume() 相同。
  • start()启动 timelineQTimeLine 将进入运行状态一旦它进入事件循环将在定期间隔时更新其当前时间、帧和值。默认间隔为 40 毫秒即每秒 25 次。可以通过调用 setUpdateInterval() 来更改更新间隔。

    timeline 将从位置 0 处开始或者如果是相反方向则从结束位置开始。如果需要在不重新启动的情况下恢复已停止的时间轴可以调用 resume()。

timeline 的状态可以根据 state() 函数来获取当状态改变时会发射 stateChanged() 信号。

方向

枚举 QTimeLine::Direction

该枚举描述 timeline 在 Running 状态时的方向。

常量描述
QTimeLine::Forward0timeline 的当前时间随时间增加即从 0 移动到结束/持续时间。
QTimeLine::Backward1timeline 的当前时间随时间减小即从结束/持续时间移动到 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::EaseInCurve0值开始缓慢增长然后迅速增加。
QTimeLine::EaseOutCurve1值开始稳定增长然后缓慢结束。
QTimeLine::EaseInOutCurve2值开始缓慢增长然后稳定增长然后再次缓慢增长。
QTimeLine::LinearCurve3值线性式增长例如如果持续时间是 1000ms则在时间 500ms 处的值是 0.5。
QTimeLine::SineCurve4值正弦式增长
QTimeLine::CosineCurve5值余弦式增长

注意默认情况下QTimeLine 使用 EaseInOut 曲线形状它提供一个慢慢增长然后稳定增长最终慢慢增长的值。对于自定义时间轴可以重新实现 valueForTime()在这种情况下QTimeLine 的 curveShape 属性被忽略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值