Qt之QTimeLine

简介: 简述QTimeLine 类提供了用于控制动画的时间轴,通常用于通过定期调用一个槽函数来动画一个 GUI 控件。相信了解动画的人对帧应该不陌生,可以把一个动画想象成由很多张静态画面组成,而每一个画面就是一帧图像。每隔一定时间间隔就显示一帧图像,当该间隔较短时,人眼就感觉不出来了,觉得看到的是连续的影像。简述详细说明状态方向曲线形状详细

简述

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 属性被忽略。

目录
相关文章
|
3月前
|
安全 C++
Qt moveToThread
Qt moveToThread
41 0
|
开发框架 Linux API
2023-6-1-Qt是什么
2023-6-1-Qt是什么
114 0
|
网络协议 Java PHP
|
Java C++
Qt之QFuture
简述 QFuture 类代表一个异步计算的结果。 要启动一个计算,使用 Qt之Concurrent框架 中的 APIs 之一。 QFuture 允许线程与一个或多个结果同步,这些结果将在稍后的时间点准备就绪,该结果可以是具有默认构造函数和拷贝构造函数的任何类型。如果一个结果在调用 result()、resultAt() 或 results() 函数时不可用,QFutur
2042 0
|
存储 安全 Windows
Qt之QEvent
简述 QEvent 类是所有事件类的基类,事件对象包含事件参数。 Qt 的主事件循环(QCoreApplication::exec())从事件队列中获取本地窗口系统事件,将它们转化为 QEvents,然后将转换后的事件发送给 QObjects。 一般来说,事件来自底层窗口系统(spontaneous() 返回 true),但也可以使用 QCoreApplication:
1818 0
|
安全 Java
Qt之QThreadPool和QRunnable
简述 QRunnable 是所有 runnable 对象的基类,而 QThreadPool 类用于管理 QThreads 集合。 QRunnable 类是一个接口,用于表示一个任务或要执行的代码,需要重新实现 run() 函数。 QThreadPool 管理和循环使用单独的 QThread 对象,以帮助程序减少创建线程的成本。每个 Qt 应用程序都有一个全局 QThre
3570 0
Qt之QDateEdit和QTimeEdit
简述 QDateEdit类提供了一个部件,用于编辑日期。QTimeEdit类提供了一个部件,用于编辑时间。 简述 详细描述 基本使用 各司其职 莫强求 更多参考 详细描述 QDateEdit和QTimeEdit均继承自QDateTimeEdit,许多特性和功能都有QDateTimeEdit提供。这些都是相关属性: QDateEdit da
2928 0
|
Unix Linux Windows
Qt之QLocalServer
简述 QLocalServer提供了一个基于本地socket的server。 QLocalServer可以接受来自本地socket的连接。通过调用listen(),让server监听来自特定key的连接。 调用nextPendingConnection()来接受一个挂起(等待)的连接作为一个已连接的QLocalSocket。函数返一个QLocalSocket指针,可以被
2054 0