• 简述:QPropertyAnimation (动画类,用来向QObject对象添加动画)

该类的继承框图如下所示:

1.QAbstractAnimation(所有动画的抽象基类)

该抽象类为QPropertyAnimation提供了动画播放,暂停,停止,持续时间,循环周期等抽象函数.

其中常用的成员函数如下所示:

int   currentLoop() const                   //获取当前动画已经循环了几个周期了

int   currentTime() const                     //获取当前动画已经启动了多少时间

void   setLoopCount(int loopCount);           //设置动画循环次数,默认为1(表示动画运行1次就停止),如果为-1,则表示动画一直循环,直到调用stop()为止.

void  setDirection(Direction direction);     //设置动画方向,默认为QAbstractAnimation::Forward(表示从起始点到结束点),也可以设置为QAbstractAnimation::Backward.

常用信号函数如下所示:

void   currentLoopChanged(int currentLoop);      //动画运行周期信号函数,当周期进行新的循环时,则会发出这个信号

void   finished();                    //当动画完成后,则会发出这个信号

void  stateChanged(QAbstractAnimation::State newState, QAbstractAnimation::State oldState);   
//当动画发生改变(停止/暂停/运行)时,则会发出这个信号, newState表示动画改变后的状态, oldState表示动画改变前的状态 void directionChanged(QAbstractAnimation::Direction newDirection);//当动画发生方向改变时,这会发出这个信号,

常用槽函数如下所示:

void  pause();                          //暂停动画

void  resume();                       //恢复动画

void  setCurrentTime(int msecs);   //直接更改当前动画的进度时间,可以通过currentTime()函数来获取改的值

void  setPaused(bool paused);   //和pause()类似,但是有个参数,如果paused为真则暂停动画,否则就是恢复动画

void  start(QAbstractAnimation::DeletionPolicy policy = KeepWhenStopped);   //启动动画
//默认参数为KeepWhenStopped,表示停止动画时,保持当前状态
//如果改为DeleteWhenStopped,则表示停止动画时,自动删除 void stop(); //停止动画

2.QVariantAnimation (动画的多样类)

该QVariantAnimation类主要是为QPropertyAnimation类提供动画起始结束的位置,方向,运动等机制

该类常用函数如下所示:

void         setStartValue(const QVariant &value);           //设置动画启动的位置
void setEndValue(const QVariant &value); //设置动画结束的位置
void setDuration(int msecs); //设置动画运行一次需要的时间,单位为毫秒 QEasingCurve easingCurve() const; //返回EasingCurve曲线的设置(EasingCurve:可以设置动画运动曲线的动作) void setEasingCurve(const QEasingCurve &easing); //设置动画运动时的EasingCurve曲线 void setKeyValueAt(qreal step, const QVariant &value); //设置动画在不同时间帧时所在的位置
//step(0~1): 时间帧,0表示为开始的帧,1表示结束的帧,0.5表示在中间的时间帧
// value:表示对应的step时间帧所在的动画位置(比如设置抖动,则会用到该函数) QVariant keyValueAt(qreal step) const; //返回step时间帧所在的动画位置

该类常用信号函数如下所示:

void         valueChanged(const QVariant &value);
//当运行的动画位置在改变时,则会发出这个信号

3.QPropertyAnimation (用来向QObject对象添加动画属性)

该类的构造函数如下所示:

QPropertyAnimation(QObject *target, const QByteArray &propertyName, QObject *parent = Q_NULLPTR);
// target:要实现动画的目标对象
// propertyName:动画属性名称
// parent:该动画的父类,一般设为this

4.示例1-界面实现下降动画

效果如下:

PS:由于GIF录制无法录制带阴影的界面,所以将界面阴影屏蔽掉了.

PS:如果动画启动失败,则看看父界面是否布局了.

代码如下:

void loginwindow::initAnimation()                 //在构造函数里调用该函数
{
DownAnimation = new QPropertyAnimation(this,"geometry",this);
DownAnimation->setDuration(); //设置动画时间
QDesktopWidget* desktop = qApp->desktop();
DownAnimation->setStartValue(QRect((desktop->width() -this->width())/,(desktop->height() -this->height())/,this->width(),)); //起始位置
DownAnimation->setEndValue(QRect((desktop->width() -this->width())/,(desktop->height() -this->height())/,this->width(),this->height())); //结束位置
DownAnimation->start(); //启动动画
}

这个我们只是实现单个动画,如果该动画后面还要实现其它动画,则需要信号槽机制来实现.

5.示例2-通过信号槽机制实现多个动画串行运行

启动界面时,通过下降动画结束后,再来继续实现logo向上浮的动画(参考的QQ启动画面)

效果如下所示:

代码如下:

//设置图标
void loginwindow::setIconPix(QLabel *l,const QString & name,QSize size)
{
QPixmap pix(name);
pix = pix.scaled(size,Qt::IgnoreAspectRatio);
l->setPixmap(pix);
l->setFixedSize(size);
}
//初始化动画
void loginwindow::initAnimation()
{
QSize size(,);
logo = new QLabel(this);
setIconPix(logo,":logo",size); //设置logo图标
logo->move(this->width()/-size.width()/,);
logo->hide(); //先隐藏 //设置图标上浮动画
LogoAnimation = new QPropertyAnimation(logo,"geometry",this);
LogoAnimation->setDuration();
LogoAnimation->setStartValue(QRect(this->width()/-size.width()/,,,));
LogoAnimation->setEndValue(QRect(this->width()/-size.width()/,,,)); //设置界面下降动画
DownAnimation = new QPropertyAnimation(this,"geometry",this);
DownAnimation->setDuration();
QDesktopWidget* desktop = qApp->desktop();
DownAnimation->setStartValue(QRect((desktop->width() -this->width())/,(desktop->height() -this->height())/,this->width(),));
DownAnimation->setEndValue(QRect((desktop->width() -this->width())/,(desktop->height() -this->height())/,this->width(),this->height()));
DownAnimation->start(); //连接槽函数
connect(DownAnimation,SIGNAL(finished()),this,SLOT(DownAnimationOnfinished()));
}
//槽函数,用来启动图标上浮动画
void loginwindow::DownAnimationOnfinished()
{
logo->show();
LogoAnimation->start();
}

6.示例3-界面关闭时实现居中关闭

效果如下:

PS:GIF录制的帧数不达标,有点延迟.

关闭居中的代码如下:

//初始化动画
void loginwindow::initAnimation()
{
//... ... 省略其它动画初始化
CloseAnimation = new QPropertyAnimation(this,"geometry",this);
CloseAnimation->setDuration(); connect(ui->title_close,SIGNAL(clicked()),this,SLOT(CloseAnimationOnStart()));
connect(CloseAnimation,SIGNAL(finished()),this,SLOT(close()));
}; //关闭槽函数,由于界面随时会在任意XY位置,所以需要在关闭时,再来初始化CloseAnimation的起始和结束的动画位置
void loginwindow::CloseAnimationOnStart()
{
CloseAnimation->setStartValue(QRect(this->geometry()));
CloseAnimation->setEndValue(QRect(this->x(),this->y()+this->height()/-,this->width(),));
CloseAnimation->start();
}

7.QParallelAnimationGroup并行动画组

该QParallelAnimationGroup类主要是用来封装多个QPropertyAnimation动画类,从而实现并行运行多个动画

来个示例,当我们点击登录按钮时,同时的将logo向下降,并且将stackedWidget登录窗口也向下降,再重新升起stackedWidget下的第二个校验登录窗口.

效果如下:

实现的代码如下:

void loginwindow::initAnimation()
{
QSize logoSize(,); //此处忽略其它动画... ... //图标下浮动画
LogoDownAnimation = new QPropertyAnimation(logo,"geometry",this);
LogoDownAnimation->setDuration();
LogoDownAnimation->setEndValue(QRect(this->width()/-logoSize.width()/,,logoSize.width(),logoSize.height()));
LogoDownAnimation->setStartValue(QRect(this->width()/-logoSize.width()/,,logoSize.width(),logoSize.height())); //stackedWidget窗口下浮动画
LogoInDownAnimation = new QPropertyAnimation(ui->stackedWidget,"geometry",this);
LogoInDownAnimation->setDuration();
LogoInDownAnimation->setStartValue(QRect(,ui->widget_title->height(),ui->stackedWidget->width(),ui->stackedWidget->height())); //从title界面的高度起点
LogoInDownAnimation->setKeyValueAt(0.6,QRect(,ui->window->height(),ui->stackedWidget->width(),ui->stackedWidget->height())); //到主界面底部
LogoInDownAnimation->setEndValue(QRect(,logoSize.height()/+,ui->stackedWidget->width(),ui->stackedWidget->height())); //到150的高处 //设置并行动画组
LoginGroup = new QParallelAnimationGroup;
LoginGroup->addAnimation(LogoDownAnimation);
LoginGroup->addAnimation(LogoInDownAnimation); connect(ui->login,SIGNAL(clicked()),LoginGroup,SLOT(start()));
connect(ui->cancelLogin,SIGNAL(clicked()),LoginGroup,SLOT(start()));
connect(LoginGroup,SIGNAL(finished()),this,SLOT(goCheckorLoginFinished()));
} void loginwindow::goCheckorLoginFinished()
{
if(LoginGroup->direction() == QAbstractAnimation::Forward)
{
ui->stackedWidget->setCurrentIndex();
LoginGroup->setDirection(QAbstractAnimation::Backward);
}
else
{
ui->stackedWidget->setCurrentIndex();
LoginGroup->setDirection(QAbstractAnimation::Forward);
}
}

PS:

我们初始化动画时,提供的属性名称为"geometry",表示提供的是界面的XYWH4个值.

当然也有其它名称,比如:

    QPropertyAnimation  *anima1= new QPropertyAnimation(m_topWidget, "pos");    //设置XY位置
anima1->setDuration();
anima1->setStartValue(QPoint(, )); //起始时,为0,0位置
anima1->setEndValue(QPoint(, )); //500ms后,为0,100位置 QPropertyAnimation *anima2= new QPropertyAnimation(m_grayWidget, "opacity"); //设置透明度
anima2->setDuration();
anima2->setStartValue(); //起始时,为不透明
anima2->setEndValue(); //500ms后,为透明

40.QT-QPropertyAnimationdong和QParallelAnimationGroup动画实现的更多相关文章

  1. Windows Phone开发(40):漫谈关键帧动画之中篇

    原文:Windows Phone开发(40):漫谈关键帧动画之中篇 一.DiscreteDoubleKeyFrame 离散型关键帧动画,重点,我们理解一下"离散"的意思,其实你查一 ...

  2. qt程序启动播放动画

    qt程序启动播放动画 编辑删除转载 2016-01-20 10:23:11 标签:qt启动动画 1.播放动画 QAxWidget *flash = , ); //QAxWidget使用的是Active ...

  3. Qt编写自定义控件二动画按钮

    现在的web发展越来越快,很多流行的布局样式,都是从web开始的,写惯了Qt widgets 项目,很多时候想改进一下现有的人机交互,尤其是在现有的按钮上加一些动画的效果,例如鼠标移上去变大,移开还原 ...

  4. Qt之对话框消失动画

    一.效果展示 最近做了一个提示框消失的功能,觉着挺有意思,以前一直以为Qt子窗口不能做淡出效果,其实Qt的淡出功能已经帮我们封装好了,我们仅仅只需要几行代码就可以做出酷炫的窗口关闭效果,写此篇文章的时 ...

  5. Qt QLabel 播放GIF动画

    很久以前用过,不过慢慢的不用了,就慢慢的忘记了,今天拾起来,记录一下,以后用的时候可以翻一下 QLabel播放GIF动画其实很简单 第一步,需要包含头文件,Qt播放GIF动画,我使用的是QMovie类 ...

  6. Qt终结者之QML动画

    前言 使用QML差不多2年了,在使用过程中深深的感受到QML的强大与便捷,让我深陷其中,不能自拔.其中QML相比传统的界面最大的优势就是便捷的动画效果与炫酷的粒子效果,让QML做出来的界面能媲美WPF ...

  7. AJ学IOS(40)UI之核心动画_抖动效果_CAKeyframeAnimation

    AJ分享,必须精品 效果: 效果一: 效果二: 代码: // // NYViewController.m // 图片抖动 // // Created by apple on 15-5-8. // Co ...

  8. 40.qt quick- 高仿微信实现局域网聊天V4版本(支持gif动图表情包、消息聊天、拖动缩放窗口)

    在上章37.qt quick- 高仿微信实现局域网聊天V3版本(添加登录界面.UDP校验登录.皮肤更换.3D旋转),我们已经实现了: 添加登录界面. UDP校验登录. 皮肤更换. 3D旋转(主界面和登 ...

  9. QT动画介绍(有例子可以下载)

    所谓动画就是在一个时间段内的不同时间点有不同的状态,只要定义好这样状态,实现动画就是水到渠成的事情.当然做这件事情,最好用的就是状态机,点击这里查看Qt使用状态机实现动画效果实例. 不过,实现动画也有 ...

随机推荐

  1. 2018.5.31 nRF905 test

    1 试电机:自动控制测试流程(Labview程序,加载扫描仪,自动测试夹具,测试数据保存) 2 USB RF收发器: 含S/N码发送读取功能(S/N:) The specific use please ...

  2. xxx was built without full bitcode" 编译错误解决

    xxx was built without full bitcode" 编译错误解决 iOS 打包上线 All object files and libraries for bitcode ...

  3. 【二叉查找树】05根据升序的链表构造二叉查找树【Convert Sorted List to Binary Search Tree】

    利用递归,构造二叉查找树, ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给一个 ...

  4. uoj279温暖会指引我们前行

    暖气来啦~ 动态树维护最大生成树裸题 #include<iostream> #include<cstdio> #include<cstdlib> #include& ...

  5. Android的Notification相关设置

    Android手机:三星Galaxy S6 Android版本:Android 7.0 Android系统自带的本地通知会从顶部Pop下来,用来提示用户有新的消息,然后在Notification栏中停 ...

  6. 强烈建议使用国外DNS解析域名,解决访问速度和某些访问故障!

    域名解析的基本原理是把域名翻译成IP地址,以便计算机能够进一步通信,传递网址和内容等. 域名劫持就是在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则直接返回假的IP ...

  7. 洛谷【P1619】 解一元二次方程的烦恼

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P16 ...

  8. 机器学习:Jupyter Notebook中numpy的使用

    一.Jupyter Notebook的魔法命令 # 模块/方法 + ?或者help(模块/方法):查看模块/方法的解释文档: 1)%run # 机械学习中主要应用两个魔法命令:%run.%timeit ...

  9. 【转】 Pro Android学习笔记(六六):安全和权限(3):Provider权限

    目录(?)[-] 访问其他应用的content provider Provider的读写权限 Provider的URI权限 Provider的granting 全局granting 部分URI的gra ...

  10. 资料:MVC框架+SQL Server 数据集成引擎

    ylbtech-资料:MVC框架+SQL Server 数据集成引擎 1.返回顶部 1. 功能特点: MVC框架耦合性低视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样 ...