QT动画

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),我们还是可以自己对数据进行二次加工,生成我们想要的任意规律的数字。

利用QTimeLine我们很容易实现一些图像消隐的效果,只需要你在每个间隔结束后显示图像消隐过程中不同阶段的一个定格即可。这里就有一个很好的例子,短短300余行,想必用不了你多长时间即可读通

http://qt.gitorious.org/qt-labs/graphics-dojo/trees/master/genie

我们www.cuteqt.com也奉献一个,互相交流:)

timeline-simple.tar

QT动画——动画组

如果是串行的话,那么动画anim1运行之后,才会运行anim2。如果是并行的话,两个动画是同时运行的。如果加了动画组,那么单个anim1->start()就没必要再单独调用了,由动画组来管理。 下面是一个可运行的代码,两只小鸟分别从窗体左上角和右下角移动到中间。
复制代码
  1. #include <QApplication>
    #include <QWidget>
    #include <QLabel>
    #include <QPixmap>
    #include <QPropertyAnimation>
    #include <QSequentialAnimationGroup>
    #include <QParallelAnimationGroup>

    int main(int argc,char *argv[]){
        QApplication app(argc,argv);
        QWidget *w=new QWidget();
        w->resize(300,400);
        QPixmap birdimg=QPixmap(”twitter-bird.png”).scaled(40,40);
        QLabel *bird_1=new QLabel(w);
        bird_1->setPixmap(birdimg);
        QPropertyAnimation *anim1=new QPropertyAnimation(bird_1, “pos”);
        anim1->setDuration(2000);
        anim1->setStartValue(QPoint(0, 360));
        anim1->setEndValue(QPoint(110, 180));
        //anim1->setEasingCurve(QEasingCurve::OutBounce);
        anim1->start();
        QLabel *bird_2=new QLabel(w);
        bird_2->setPixmap(birdimg);
        QPropertyAnimation *anim2=new QPropertyAnimation(bird_2, “pos”);
        anim2->setDuration(2000);
        anim2->setStartValue(QPoint(0, 0));
        anim2->setEndValue(QPoint(150, 180));
        anim2->setEasingCurve(QEasingCurve::OutBounce);
        QSequentialAnimationGroup group;
        //QParallelAnimationGroup group;
        group.addAnimation(anim1);
        group.addAnimation(anim2);
        group.start();
        bird_1->move(-40,-40);
        bird_2->move(-40,-40);
        w->show();
        return app.exec();
    }

QT动画——.GIF

在QT中要显示GIF图片,不能通过单单的添加部件来完成.

还需要手动的编写程序.

工具:QT Creator

新建一个工程,我们先在designer中,添加一个QLabel部件.

如下图:

QT中显示动画(.GIF)
将QLabel拉成适当大小.

在类cpp函数中添加如下程序:

#include " widget.h "
#include
" ui_widget.h "
#include
< QLabel >
#include
< QMovie >

Widget::Widget(QWidget
* parent):
QWidget(parent),
ui(
new Ui::Widget)
{
ui
-> setupUi( this );
QMovie
* movie = new QMovie( " D:/Project/Qt/testclass/2.gif " );
ui
-> label -> setMovie(movie);
movie
-> start();
}

Widget::
~ Widget()
{
delete ui;
}

Qlabel和QMovie实现动画
ui->label_3->setScaledContents(true);
QMovie *movie=new QMovie("sub_menu_side_panel.gif");
ui->label_3->setMovie(movie);
movie->start();
以上代码即可实现图片动画效果,movie所支持的图片格式为gif和mng。

将以上代码中的movie->start();替换为
movie->setCacheMode(QMovie::CacheAll);
movie->jumpToFrame(3);
则实现的效果就不是连续的图片变化,而是单独跳到某一帧,第一帧为0,要使movie能够单独调到某一帧,必须设置setCacheMode(QMovie::CacheAll);

qDebug()<<"Total Frame is :"<<movie->frameCount();
qDebug()<<"current Frame is:"<<movie->currentFrameNumber();
QList<QByteArray>  te=movie->supportedFormats();
qDebug()<<te;


  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值