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

7,013次阅读
没有评论

共计 2391 个字符,预计需要花费 6 分钟才能阅读完成。

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);
}

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

正文完
请博主喝杯咖啡吧!
post-qrcode
 
admin
版权声明:本站原创文章,由 admin 2016-04-10发表,共计2391字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码