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

目录
相关文章
|
Linux 调度 数据安全/隐私保护
Qt之QFtp
简述 QFtp 类提供了一个 FTP 协议的客户端实现。 该类提供了一个到 FTP 的直接接口,允许对请求有更多的控制。但是,对于新的应用程序,建议使用 QNetworkAccessManager 和 QNetworkReply,因为这些类拥有一个更简单、还更强大的 API。 简述 QFtp 工作流程 基本使用 连接并登录 FTP 服务器 切换工作目录 列出目
7126 1
|
7月前
【Qt】- QMainWindwo
【Qt】- QMainWindwo
|
7月前
|
Linux 定位技术 C++
【Qt】-学Qt前的准备
【Qt】-学Qt前的准备
|
安全 并行计算
Qt之QFutureWatcher
简述 QFuture 表示异步计算的结果,QFutureWatcher 则允许使用信号和槽监视 QFuture,也就是说,QFutureWatcher 是为 QFuture 而生的。 简述 详细描述 基本使用 更多参考 详细描述 QFutureWatcher 提供了有关 QFuture 的信息和通知,使用 setFuture() 函数开始监视一个特
3713 0
|
Java C++
Qt之QFuture
简述 QFuture 类代表一个异步计算的结果。 要启动一个计算,使用 Qt之Concurrent框架 中的 APIs 之一。 QFuture 允许线程与一个或多个结果同步,这些结果将在稍后的时间点准备就绪,该结果可以是具有默认构造函数和拷贝构造函数的任何类型。如果一个结果在调用 result()、resultAt() 或 results() 函数时不可用,QFutur
2043 0
|
数据安全/隐私保护
Qt之QUrl
简述 QUrl 类提供了一个方便的接口使用 URLs。 它可以解析和构造编码和未编码形式的 URLs。QUrl 也支持国际化域名(IDNs)。 简述 详细描述 错误检查 字符转换 URL格式 scheme Authority user info path query fragment 深入使用 相对路径 用户输入 文件名 主机端口 本地文件 百分比编码
6346 0
Qt之QDateTimeEdit
简述 QDateTime类提供了一个部件,用于编辑日期和时间。 QDateTimeEdit允许用户编辑日期,通过使用键盘或箭头键来增加和减少日期和时间值。箭头键可以在QDateTimeEdit内进行部分移动,日期和时间的格式按照setDisplayFormat()设置的显示。 简述 基本使用 效果 源码 日期时间格式 效果 源码 日期时间范围 效果
2718 0
|
Unix Linux Windows
Qt之QLocalServer
简述 QLocalServer提供了一个基于本地socket的server。 QLocalServer可以接受来自本地socket的连接。通过调用listen(),让server监听来自特定key的连接。 调用nextPendingConnection()来接受一个挂起(等待)的连接作为一个已连接的QLocalSocket。函数返一个QLocalSocket指针,可以被
2059 0