QTimeLine类解释

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 

其实动画的本质就是在每一定时间间隔内显示一帧图像,当这个间隔较短的时候人眼就感觉不出来了,觉得看到的是连续的影像。Qt为开发动画效果的人员提供了一个很好的时间控制类QTimeLine.

 

QTimeLine的最简单用法是

 

1 QTimeLine timeline=new QTimeLine(1000);

2 timeLine->setFrameRange(0, 100);

3 connect(timeline,SIGNAL(frameChanged(int)),yourobj,SLOT(yourobjslot(int)));

4 timeline->start();

 

解释:

 

1. 创建的时间线持续时长,参数值是毫秒数,1000就是1秒

2. 在这段时间线内,创建的输出值范围。也就是第三行中frameChanged信号里传出的参数值范围

3. QTimeLine的默认时间间隔是40ms(也就是1秒25帧),每个间隔会发出一个frameChanged()的信号,此处将该信号连接到你能控制动画效果的对象和槽上。

4. 启动timeline后,每个时间间隔的frameChanged()信号才能正常发出。

 

 

当然还有一些复杂的参数设置可以更好的控制你的效果。

 

setLoopCount(int count)该函数控制了动画的重复次数。默认是1,如果设置成0则表示无限循环。

setUpdateInterval(int interval)该函数用于控制更新动画的时间间隔。

 



相当于设定了时间总数和单次时间的QTimer

是对QTimer的扩展,封装

另外提醒一下,有时候对间隔的设置可能达不到预定的次数,因为程序的执行效率无法达到这样的次数。所以对次数的设置 要合理!

举个例子吧:

    m_timeLine = new QTimeLine(1000);
    m_timeLine->setFrameRange(0,100);
    m_timeLine->setUpdateInterval(1);

这样的定时器,在1000ms内,只能重复执行了56次(有时候是55次).....以后用的时候注意!


补充:setFrameRange和setUpdateInterval没有直接关系,第一个是活动范围,后面的是间隔范围;使用的时候区分。

    m_timeLine->setFrameRange(0,100);
    m_timeLine->setUpdateInterval(1);

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 

### QTimeLine 功能实现 `QTimeLine` 是 Qt 提供的一个,用于管理基于时间的变化过程。它可以通过指定时间段内的帧数来定义动画或其他动态效果的行为。以下是关于 `QTimeLine` 实现的关键点: #### 1. 枚举状态及其作用 `QTimeLine` 使用三种主要的状态来表示其生命周期: - **NotRunning (0)**:时间线处于停止状态,既不运行也不暂停。此状态下,时间和值不会改变,除非手动调用 `setCurrentTime()` 或者启动时间线[^1]。 - **Paused (1)**:时间线被暂停,可以随时通过调用 `setPaused(false)` 来恢复运行[^1]。 - **Running (2)**:时间线正在运行期间会周期性地更新当前时间,并触发相应的信号(如 `valueChanged()` 和 `frameChanged()`)。这些信号可用于驱动 UI 组件的位置、大小等属性变化[^1]。 #### 2. 设置时间范围和持续时间 为了使 `QTimeLine` 能够正常工作,必须为其设定两个重要参数: - **持续时间**:通过构造函数传递给 `QTimeLine` 对象,单位为毫秒。例如,创建一个持续时间为 1 秒的时间线对象可以用如下方式初始化: ```cpp QTimeLine *timeLine = new QTimeLine(1000); ``` - **帧范围**:使用 `setFrameRange(int start, int end)` 方法设置起始帧到结束帧之间的区间。这决定了整个动画过程中有多少离散步进可供利用[^2]。 #### 3. 连接信号槽机制 实际应用中通常需要监听某些特定时刻发生的事情以便执行相应操作。为此,`QTimeLine` 提供了几个常用的信号: - 当前帧发生变化时发射的 `frameChanged(int frame)`; - 时间线上下文中的数值变动时发出的 `valueChanged(qreal value)`; - 整个进程完成后激活一次性的 `finished()`。 下面是一个完整的例子展示如何结合上述概念制作简单的移动动画效果[^3]: ```cpp #include <QtWidgets> class Widget : public QWidget { public: explicit Widget(QWidget *parent = nullptr); private slots: void onFrameChanged(int frame); void onAnimationFinished(); private: QPushButton *m_button; QLabel *m_label; }; Widget::Widget(QWidget *parent) :QWidget(parent), m_button(new QPushButton("Move", this)), m_label(new QLabel("Label", this)) { QVBoxLayout layout(this); layout.addWidget(m_button); layout.addWidget(m_label); auto timeLine = new QTimeLine(2000, this); // 创建一个两秒钟完成的计时器实例 timeLine->setFrameRange(0, 100); // 设定从第零帧至第一百帧共一百格的画面转换进度条长度 QObject::connect(timeLine, &QTimeLine::frameChanged, this , [this](int f){onFrameChanged(f);} ); QObject::connect(timeLine, &QTimeLine::finished , this , [this]{onAnimationFinished();} ); connect(m_button,SIGNAL(clicked()),timeLine,SLOT(start())); } void Widget::onFrameChanged(int frame){ const double progress=(double)frame/100.; QPoint pos=mapToParent({progress*width(),height()/4}); m_label->move(pos.x()-m_label->width()/2,pos.y()); } void Widget::onAnimationFinished(){ qDebug()<<"Animation Finished"; } int main(int argc,char*argv[]){ QApplication app(argc, argv); Widget w; w.show(); return app.exec(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值