Qt属性动画仿真QPropertyAnimation的使用
一、QPropertyAnimation
的基本使用
1、常用接口函数
- setTargetObject:设置仿真对象
- setPropertyName:设置仿真属性的名称,
- setDuration:设置仿真持续的时间
- setStartValue:设置初始值
- setEndValue:设置结束值
- start:开始仿真
- currentValue:返回当前值
- setKeyValueAt:设置关键点的值
- valueChanged:只要仿真追踪的值发生变化,就发送该信号
2、如让一个矩形进行运动的仿真
头文件.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_QtTimeSet.h"
#include <QLabel>
#include<QPropertyAnimation>class QtTimeSet : public QWidget
{Q_OBJECTpublic:QtTimeSet(QWidget *parent = Q_NULLPTR);protected slots:/// <SUMMARY>/// 点击按钮 开始动画运动/// </SUMMARY>void DoStart();private:Ui::QtTimeSetClass ui;QPropertyAnimation *animation;QLabel *label01;
};
对应.cpp
文件
#include "QtTimeSet.h"#include <QRect>
#include <QFrame>QtTimeSet::QtTimeSet(QWidget *parent): QWidget(parent)
{ui.setupUi(this);label01 = new QLabel(this);label01->setGeometry(0, 0, 300, 100);label01->setFrameShape(QFrame::Box);label01->setStyleSheet("background-color:blue");//设置仿真对象为label01,设置该对象的几何属性为仿真变量animation = new QPropertyAnimation(label01, "geometry");animation->setDuration(1000); //动画持续的时间(毫秒)animation->setStartValue(QRect(0, 0, 300, 100)); //动画属性开始时的值animation->setEndValue(QRect(300, 300, 300, 100)); //动画属性结束时的值connect(ui.btn01, &QPushButton::clicked, this, &QtTimeSet::DoStart);
}void QtTimeSet::DoStart()
{animation->start();
}
结果如下,点击 PushButton01矩形开始按照设定的时间间隔进行移动
二、对自定义的变量进行动画仿真
由于QPropertyAnimation
并不是对所有的变量都支持动画,如果是自定义的变量就需要自行处理,才能够让Qt
对该变量进行追踪和仿真。
1、对自定义的整型变量dis
值进行追踪仿真显示
- code如下
/********** 头文件 QAnimationTest.h ***********/
#pragma once#include <QtWidgets/QWidget>
#include "ui_QAnimationTest.h"
#include <QPropertyAnimation>class QAnimationTest : public QWidget
{Q_OBJECT//首先要通过Q_PROPERTY宏添加自己自定义的属性来让QPropertyAnimation追踪到,//在此该属性为整型变量 disQ_PROPERTY(int dis READ getDistance WRITE setDistance)public:QAnimationTest(QWidget *parent = Q_NULLPTR); int getDistance() const; //获取移动的距离void setDistance(const int &dis0); //设置移动的距离protected slots:void StartAnimate(); //开始仿真槽函数void ShowNum(const QVariant &val); //在QLabel中显示仿真属性的当前值 private:Ui::QAnimationTestClass ui;QPropertyAnimation *animation;int moveDis;
};
/********** 主程序 QAnimationTest.cpp ***********/
#include "QAnimationTest.h"
#include <QPushButton>QAnimationTest::QAnimationTest(QWidget *parent): QWidget(parent)
{ui.setupUi(this);ui.labelShowNum->setStyleSheet("color:red;font-size:60px;");moveDis = 60;animation = new QPropertyAnimation;animation->setTargetObject(this);animation->setPropertyName("dis"); //第二个参数的类型一定要和声明的参数dis一样,否则会失败animation->setDuration(5000);connect(ui.StartButton, &QPushButton::clicked, this, &QAnimationTest::StartAnimate);connect(animation, &QVariantAnimation::valueChanged, this, &QAnimationTest::ShowNum);
}void QAnimationTest::StartAnimate()
{if (moveDis == 10){moveDis = 60;}animation->setStartValue(moveDis);animation->setEndValue(10);animation->start();
}void QAnimationTest::ShowNum(const QVariant &val)
{int textNum = val.toInt();ui.labelShowNum->setText(QString::number(textNum));
}int QAnimationTest::getDistance() const
{return moveDis;
}void QAnimationTest::setDistance(const int &dis)
{moveDis = dis;
}
- 运行结果如下:点击
Start
按钮即开始进行动画仿真。
2、总结分析
- 不同的写法:
//如下的代码也可以在创建的时候指定好目标仿真的目标对象和仿真属性的名称animation = new QPropertyAnimation;animation->setTargetObject(this);animation->setPropertyName("dis");//另一种写法:
animation = new QPropertyAnimation(this,"dis");
- 可以通过
setKeyValueAt
来在指定的位置设置指定的值,从而便于对仿真值进行非线性控制,如在整个仿真过程中:
//设置设置初始值为50,animation->setKeyValueAt(0, 50);//仿真进行到中间时刻时,值变化到10animation->setKeyValueAt(0.5, 10);//然后从10开始到结束仿真时,值变为60animation->setKeyValueAt(1, 60);
三、通过自定义的变量来控制一些控件的UI属性
1、Code头文件如上不变,.cpp文件如下
/***** .cpp ********/
#include "QAnimationTest.h"
#include <QPushButton>QAnimationTest::QAnimationTest(QWidget *parent): QWidget(parent)
{ui.setupUi(this);ui.labelShowNum->setStyleSheet("color:red;font-size:60px;");moveDis = 255;//第二个参数的类型一定要和声明的参数dis一样,否则会失败animation = new QPropertyAnimation(this,"dis");animation->setDuration(8000);animation->setStartValue(moveDis);animation->setEndValue(10);connect(ui.StartButton, &QPushButton::clicked, this, &QAnimationTest::StartAnimate);connect(animation, &QVariantAnimation::valueChanged, this, &QAnimationTest::ShowNum);}void QAnimationTest::StartAnimate()
{animation->start();
}void QAnimationTest::ShowNum(const QVariant &val)
{int textNum = val.toInt();ui.labelShowNum->setText(QString::number(textNum));ui.labelShowNum->setStyleSheet(QString("background-color:rgba(200,100,%1,0.7)").arg(textNum));
}int QAnimationTest::getDistance() const
{return moveDis;
}void QAnimationTest::setDistance(const int &dis)
{moveDis = dis;
}
2、运行效果如下
参考资料
[1] Qt动画效果的实现,QPropertyAnimation
[2] Qt 之 QPropertyAnimation
Qt属性动画仿真QPropertyAnimation的使用相关推荐
- Qt 自定义动画属性 QPropertyAnimation
简述 QPropertyAnimation类定义了Qt的属性动画. QPropertyAnimation以Qt属性做差值,作为属性值存储在QVariants中,该类继承自QVariantAnimati ...
- Qt自定义动画移动路径
在使用Qt实现动画时,一般使用QPropertyAnimation来实现,一般我们实现控件的移动动画都是走直线,我们如何实现自己想要的移动路径呢,比如走圆弧.下面介绍通过QPropertyAnimat ...
- Qt属性系统及Q_PROPERTY宏的使用
0.前言 像某些编译器提供的平台特有的属性系统(Property System)一样,Qt也提供了一个复杂的属性系统.当然,作为一个跨平台框架,Qt没有依赖那些非标准的编译器特性,比如:__prope ...
- Android 属性动画(Property Animation) ObjectAnimator的介绍
先说下属性动画与视图动画的区别: 视图动画系统仅提供为 View 对象添加动画效果的功能,因此,如果您想为非 对象添加动画效果,则必须实现自己的代码才能做到.视图动画系统也存在一些限制,因为它仅公开 ...
- Android 属性动画(Property Animation) ValueAnimator 的介绍
先说下属性动画与视图动画的区别: 视图动画系统仅提供为 View 对象添加动画效果的功能,因此,如果您想为非 对象添加动画效果,则必须实现自己的代码才能做到.视图动画系统也存在一些限制,因为它仅公开 ...
- Android Property Animation属性动画:scale缩放动画(4)
Android Property Animation属性动画:scale缩放动画(4) 和之前我写的附录文章1,2,3相似,本文将接着使用Android Property Animation属性 ...
- 每日一道面试题(第7期)---Android补间动画与属性动画的区别
零零碎碎的东西总是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣.无意中发现了这个每日一道面试题,想了想如果只是简单地去思考,那么不仅会收效甚微,甚至难一点的题目自己可能都懒得去想,坚持不下来 ...
- Android源码解析(一)动画篇-- Animator属性动画系统
Android源码解析-动画篇 Android源码解析(一)动画篇-- Animator属性动画系统 Android源码解析(二)动画篇-- ObjectAnimator Android在3.0版本中 ...
- 这可能是第二好的自定义 View 教程之属性动画
上期文章镇楼: 这可能是第二好的自定义 View 教程之绘制 凯哥的文章确实写的细而好呀,这不,活生生把 面试系列 先放一放,继续讲解我们的动画. 为啥是第二好? 一看就是没看 前面的文章 的.这里就 ...
最新文章
- 记录一下g++的编译选项
- 干货 |“NLP”与“语言学家”的那些事儿
- pagerank算法实现matlab,Matlab 入门及PageRank算法求解.ppt
- 告白气球--吉他教学
- Bailian4033 铺地毯【暴力】
- 解决关于升级macOS12后Alfred for mac无法运行PHP插件的问题
- 每次连接服务器都要source ~/.bashrc问题
- linux下无法安装VMware的解决方法
- 【离散数学】图论 第七章(8) 运输网络、流和割、Ford-Fulkerson定理
- chromebook刷机_你能在大学里得到一本Chromebook吗?
- RTL8152网卡Linux驱动,openwrt增加 rtl8150 USB网卡驱动支持
- PSIFT:Pore Scale-invariant feature transform;毛孔尺度不变特征点
- 戴尔910服务器系统安装教程,图解戴尔dell工作站T3600/T5600/T7600/T7910安装windows 7系统...
- 常见服务器类型及其简单介绍
- instancetype 与 id for Objective-C
- ViewFlipper用法
- 百度搜索排名API接口PC返回JSON数据格式
- 狂神说Spring讲解第19动态代理中错误java: 不兼容的类型: com.Orac.kuang.Host无法转换为com.kuang.demo3.Rent
- iOS app脚手架
- 传感器检测技术及仪表笔记01第一章 绪论
热门文章
- 类设计者的工具(四):面向对象程序设计 (继承)
- 失联8分钟后现神秘“第7次握手” 澳两次发现疑似黑匣子信号 搜救区域最深5000米
- 25则“验尸报告”— 创业失败者启示录
- Weasis研究(一): IDEA启动运行Weasis3.0.4
- 深度学习——人工神经网络中为什么ReLu要好过于tanh和sigmoid function?
- python采集资料库所有英雄皮肤图片包含炫彩
- linux系统编程课程改革,项目驱动的Linux操作系统课程教学改革
- 开源企业开发平台教程干货:在O2OA中使用网络会议(二)
- 手机二维码识别软件3秒破译火车票信息
- BIO、NIO、AIO 有什么区别?