Qt动画框架:QTimeLine

 一、描述

时间线。此类最常用于通过定期调用槽函数来为 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值