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
    评论
### 回答1: Qt 是一个跨平台的 C++ 库,用于创建图形用户界面和应用程序。Qt 提供了丰富的功能和工具,以简化图形界面的开发过程。 在 Qt 中,可以使用多线程来实现动画启动界面。多线程能够将界面的渲染和逻辑处理分离,提高程序的响应性和用户体验。 首先,需要在主线程中创建一个启动界面的窗口,并设置该窗口为应用程序的主窗口,使其在程序启动时显示。在启动界面窗口中,可以添加一张图片或者一个动画控件,来展示用户需要的信息或者动画效果。 然后,在主线程中创建一个子线程,并在该子线程中执行后台任务和动画的逻辑处理。可以使用 QtQThread 类来创建和管理子线程。 在子线程中,可以使用 QTimer 控件来定时更新动画效果,并使用 QObject::moveToThread() 函数将动画控件或者需要更新的界面元素移动到子线程中进行渲染。 同时,需要保证子线程能够与主线程进行通信,以便在后台任务完成或动画效果更新时及时更新界面。可以使用 Qt信号和槽机制来进行线程间的通信。 最后,在主线程中,等待后台任务完成的信号,并在接收到信号后关闭启动界面窗口,显示应用程序的主窗口。 通过以上步骤,就可以实现一个使用多线程的启动界面动画。这样可以提高程序的响应速度,使用户在启动过程中能够看到动画效果,提升用户体验。同时,由于界面渲染和逻辑处理在不同线程中进行,可以减少界面卡顿的情况,保证程序的流畅性。 ### 回答2: 在Qt中,我们可以使用多线程来实现动画启动界面。下面是一个简单的示例: 首先,我们需要创建一个继承自QThread的自定义线程类。在这个线程类中,我们可以定义我们想要的动画效果。例如,可以使用QPropertyAnimation来实现一个渐变的启动界面动画。 接下来,在主线程中,我们可以通过创建一个实例化的自定义线程类对象。然后,我们可以将该线程对象启动,并在主线程中显示我们的启动界面。 下面是一个简单的示例代码: ```cpp #include <QApplication> #include <QMainWindow> #include <QThread> #include <QPropertyAnimation> class AnimationThread : public QThread { public: void run() override { // 创建一个QPropertyAnimation对象,设置动画效果 QPropertyAnimation animation; animation.setTargetObject(/* 设置动画目标对象,可以是QWidget或其他可动画化的对象 */); animation.setPropertyName(/* 设置动画属性,例如透明度 */); animation.setStartValue(/* 设置起始值 */); animation.setEndValue(/* 设置结束值 */); animation.setDuration(/* 设置动画时长 */); // 启动动画 animation.start(); // 等待动画结束 animation.wait(); } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); QMainWindow mainWindow; mainWindow.show(); // 创建并启动动画线程 AnimationThread animationThread; animationThread.start(); // 显示启动界面,并等待动画线程结束 // 在动画线程结束后关闭启动界面 // ... return a.exec(); } ``` 需要注意的是,在实际的应用中,我们可能需要在动画线程结束后关闭启动界面,并继续执行其他任务。这需要根据具体的需求进行调整。 希望以上的回答能对您有所帮助! ### 回答3: Qt动画启动界面是通过多线程实现的。在启动界面中,主线程负责界面的初始化和显示,而动画效果则通过子线程来实现。 首先,主线程会负责创建启动界面的窗口,并设置窗口的初始属性和界面布局。然后,子线程被创建并启动,其中包含动画的实现代码。 在子线程中,通常使用Qt动画框架来实现动画效果。可以使用QPropertyAnimation类来控制对象的属性变化,并通过设置动画的起始值和结束值来实现动画效果的过渡。另外,也可以使用QSequentialAnimationGroup或QParallelAnimationGroup来管理多个动画的协同播放。 子线程中的动画会在启动界面显示之前就开始播放。在动画播放过程中,主线程会不断更新界面,以实时显示动画的效果。 同时,为了确保动画的流畅播放,需要注意线程之间的同步与通信。可以使用Qt信号与槽机制,通过在子线程中发送信号,再在主线程中接收信号,并根据信号内容来更新界面。 总而言之,Qt动画启动界面通过多线程的方式实现,主线程负责界面的初始化和显示,子线程负责动画的实现,通过信号与槽机制来实现线程之间的同步与通信,以实现流畅的动画效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值