• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

Qt视图框架-Timeline&Animation动画实现

Qt admin 3年前 (2016-04-10) 3087次浏览 0个评论 扫描二维码

QT 动画——TimeLine

其实动画的本质就是在每一定时间间隔内显示一帧图像,当这个间隔较短的时候人眼就感觉不出来了,觉得看到的是连续的影像。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)该函数用于控制更新动画的时间间隔。

在 QTimeLine 所设置的持续时长过去后,相应的会发出一个 finished()的信号,你可以在接收到这个信号以后做一些扫尾的工作。

另外还有一个别致的选项:

setCurveShape(CurveShape shape),该选项用于控制间隔输出数值的一个变化规律。CurveShage 现有的选项是

QTimeLine::EaseInCurve 0 The value starts growing slowly, then increases in speed.

QTimeLine::EaseOutCurve 1 The value starts growing steadily, then ends slowly.

QTimeLine::EaseInOutCurve 2 The value starts growing slowly, then runs steadily, then grows slowly again.

QTimeLine::LinearCurve 3 The value grows linearly (e.g., if the duration is 1000 ms, the value at time 500 ms is 0.5).

QTimeLine::SineCurve 4 The value grows sinusoidally.

QTimeLine::CosineCurve 5 The value grows cosinusoidally.

不多加解释了,2 是默认值。因为即使没有这个选项,如果只输出均匀数(选项 3),我们还是可以自己对数据进行二次加工,生成我们想要的任意规律的数字。

 


主要测试代码如下:

上一篇博客的代码是利用 Qtime 类定时器实现动画的实现,这个是另外一种方法

#ifndef STARTITEM_H
#define STARTITEM_H

#include <QGraphicsItem>
#include <QPainter>

class StartItem : public QGraphicsItem
{
public:
    StartItem();
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

private:
    QPixmap pix;
};

#endif // STARTITEM_H

 #include "startitem.h"

StartItem::StartItem()
{
 pix.load("star.png");
}

QRectF StartItem::boundingRect() const
{
 return QRectF(-pix.width()/2,-pix.height()/2,pix.width(),pix.height());
}

void StartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget)
{
 painter->drawPixmap(boundingRect().topLeft(),pix);
}
 void MainWindow::slotAddAnimationItem() //在场景中加入一个动画星星
{
 StartItem *item = new StartItem;
 QGraphicsItemAnimation *anim = new QGraphicsItemAnimation;
 anim->setItem(item);
 QTimeLine *timeLine = new QTimeLine(4000);//设置创建时长为 4s
 timeLine->setCurveShape(QTimeLine::SineCurve);//速度以 sin 函数的速度
 timeLine->setLoopCount(0);//无限制循环

 anim->setTimeLine(timeLine);

 int y =(qrand()%400)-200;//设置场景中的 y 坐标
 for(int i=0;i<400;i++)
 {
 anim->setPosAt(i/400.0,QPointF(i-200,y));//设定每一步时所在的位置
 }
 timeLine->start();//开启
 scene->addItem(item);
}

星星


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Qt 视图框架-Timeline&Animation 动画实现
喜欢 (0)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!