Qt动画分享

前言

在使用Qt制作界面的过程中,经常会用到Qt的动画,Qt自带的动画框架用来做简单的控件动画效果是比较简单易用的,比如对控件的位移、缩放、透明度等,可以提高界面的科技感。

动画框架

动画框架旨在为创建动画和平滑的gui提供一种简单的方法。通过设置Qt属性的动画,框架为设置小部件和其他QObject的动画提供了极大的自由。该框架也可以与图形视图框架QGraphicsView一起使用。有关动画框架的许多知识都可以应用于QtQuick。
动画框架基础包括基类QAbstractAnimation,以及它的两个子类 QVariantAnimation 和QAnimationGroup.。QAbstractAnimation是所有动画的祖先。它表示框架中所有动画通用的基本属性;主要包含有启动、停止和暂停动画的功能。并且它还接收时间更新通知。
动画框架进一步提供QPropertyAnimation类,该类继承QVariantAnimation并执行Qt属性的动画,Qt属性是Qt的元对象系统的一部分。类使用缓和曲线对属性执行插值。因此,当您想设置一个值的动画时,可以将其声明为属性,并使您的类成为QObject。请注意,这给了我们很大的自由,在动画已经存在的小部件和其他qobject。复杂的动画可以通过构建QAbstractAnimations的树结构来构建。树是使用QAnimationGroups构建的,QAnimationGroups充当其他动画的容器。还要注意,这些组是QAbstractAnimation的子类,因此组本身可以包含其他组。

继承关系

 

常用动画类

QPropertyAnimation

QPropertyAnimation 类为 Qt 属性设置动画,QPropertyAnimation 对 Qt 属性进行插值。 由于属性值存储在 QVariants 中,该类继承了 QVariantAnimation,并支持与其超类相同元类型的动画。声明属性的类必须是 QObject。 为了能够为属性设置动画,它必须提供一个设置属性(以便QPropertyAnimation 可以设置属性的值)。

在代码中经常见到这种属性的设置

Q_PROPERTY介绍

Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property,由于该宏是Qt特有的,需要用moc进行编译,故必须继承于QObject类。

Q_PROPERTY(type name   // 数据类型 
READ getFunction      // 读函数 
[WRITE setFunction]    // 写函数[RESET resetFunction]  // 重置函数 
[NOTIFY notifySignal])  // 通知信号

举例说明如下图所示,声明一个进度属性,设置set和get函数

编译后生成中间文件moc文件

Q_PROPERTY的属性名称存储于元对象系统中QMetaObject,该属性的值并未进行存储,需要将该数据挂载到某个自定义对象上。

 

setProperty和Property介绍

QObject::setProperty,设置属性值,通过QObject::property取出该值使用QObject::setProperty创建的属性名称和数据则存储在QObject中的ExtraData中

this->setProperty("progress", 10); 
this->property("progress");

 

代码调试属性的存储位置,如下图

 

QPropertyAnimation常用函数介绍

动画方向

enum Direction 
{ Forward, // 正向 Backward // 逆向 
};// 接口
Direction direction() const; // 方向 
void setDirection(Direction direction); // 设置方向,正向增长,逆向增长

动画状态

enum State 
{ Stopped, // 停止Paused,   // 暂停 Running  // 运行中 
};state() const : State
void stateChanged(State newState, State oldState) // 槽函数)

变化曲线

setEasingCurve(const QEasingCurve &)
easingCurve() const

 

// 接口
State state() const; // 动画状态
QAnimationGroup *group() const; // 所属组
Direction direction() const;// 方向
void setDirection(Direction direction);// 设置方向,正向增长,逆向增长
int loopCount() const; // 当前动画循环次数
void setLoopCount(int loopCount);// 设置动画循环执行几次,-1为forever
virtual int duration() const = 0; // 一次持续时间  
int totalDuration() const;// 总共持续时间
void setKeyValueAt(qreal step, const QVariant &value);// 设置插值// 信号
void finished();  // 动画完成
void stateChanged(State newState, State oldState); // 动画状态改变
void currentLoopChanged(int currentLoop); // 当前一次动画执行完成,进行下次动画
void directionChanged(QAbstractAnimation::Direction); // 方向改变// 槽函数
void start(DeletionPolicy policy = KeepWhenStopped); // 开始动画
void pause(); // 暂停动画
void resume();// 启动暂停的动画
void stop(); // 停止动画

QPropertyAnimation 使用

在1秒内,进度从1更新到100,如下所示

 

QPropertyAnimation *animation = new QPropertyAnimation(testObject, "progress");
animation->setDuration(1000);
animation->setStartValue(0);
animation->setEndValue(100);
animation->start();

QPropertyAnimation 配合QWidget使用,改变位置和大小

改变控件的位置和大小,在2秒内由(0,0)位置到(30,30)位置,由大小(100,30)到(200,60)位置

QPropertyAnimation *geometryAnimation = new QPropertyAnimation(myWidget, "geometry");
animation->setDuration(2000);
animation->setStartValue(QRect(0, 0, 100, 30));
animation->setEndValue(QRect(30, 30, 200, 60));
animation->start();

QPropertyAnimation 配合QWidget使用,改变透明度
在2秒内有完全透明到完全不透明

QPropertyAnimation *opacityAnimation = new QPropertyAnimation(myWidget, "windowOpacity");
opacityAnimation->setDuration(2000);
opacityAnimation->setStartValue(0.0);
opacityAnimation->setEndValue(1.0);
opacityAnimation->start();

动画组

QSequentialAnimationGroup 串行动画

按顺序执行动画组中的所有动画

 

先改变透明度,再改变位置和大小

QSequentialAnimationGroup *group = new QSequentialAnimationGroup;
group->addAnimation(opacityAnimation);
group->addAnimation(geometryAnimation);
group->start();

QParallelAnimationGroup并行动画

并行执行所有动画,结束时间按照最后一个动画的结束时间

 

透明度和位置大小一块改变

QParallelAnimationGroup *group = new QParallelAnimationGroup;
group->addAnimation(opacityAnimation);
group->addAnimation(geometryAnimation);
group->start();

动画之间是可以相互嵌套的,是树形结构可以任意组合

 

拓展,QML中的动画

数字动画,改变矩形元素的宽度

Rectangle {id: rect;width: 100; height: 100; color: "green";NumberAnimation {target: rect;properties: "width";to: 200;duration: 2000;running: true;}
}

旋转动画,将矩形元素旋转一圈

Rectangle {id: rect;width: 100; height: 100; color: "green";RotationAnimation on rotation {from: 0;to: 360;duration: 2000;running: true;}
}

属性动画,改变矩形元素的宽度

Rectangle {id: rect;width: 100; height: 100; color: "green";PropertyAnimation {target: rect;properties: "width";to: 200;duration: 2000;running: true;}
}

颜色动画,改变矩形元素的颜色

Rectangle {id: rect;width: 100; height: 100; color: "green";ColorAnimation on color {to: "blue";duration: 2000;running: true;}
}

示例 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22798.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt Creator中切换不同Qt版本

我们安装QT版本,安装之后,Qt Creator中默认就是最新的QT版本。 例如,我之前安装了QT5.9, 第二次安装QT5.15, 则最新的都是QT5.15版本了。此时我要维护老的项目,而老的项目又是在QT5.9下开发的,许多库都在新的QT版本下编…

Qt 如何改变图标颜色

1. 下载图标 要实现图标修改颜色的功能需要去阿里巴巴矢量图标库选择自己需要的图标(网站:阿里巴巴矢量图标库),将需要的图标添加入库,如下 加入后,去右上角点击购物车图标,把代码下载下来解压…

【Qt炫酷动画】专栏导航目录

历时小半年,经过总结积累,详细剖析了Qt框架如何制作动画。 通过本专栏学习,可以学会如何diy窗体动画、控件动画 Qt动画 【Qt炫酷动画】专栏导航目录 【Qt炫酷动画】0.动画类简介 【Qt炫酷动画】1.easing官方demo详细剖析 【Qt炫酷动画】2.…

QT中怎么使用QPalette设置按钮控件背景色

这里写自定义目录标题 ui->pushButton->setAutoFillBackground(true);//获得当前选择的颜色值QStringList colorList QColor:: colorNames();QColor color QColor(colorList[ui->comboBox_3->currentIndex()]);QPalette p ui->frame_2->palette();p.setCol…

Qt基于Qml修改SVG颜色

效果: 1.引入包: import QtGraphicalEffects 1.12 2. 修改SVG颜色 Image{id: imagewidth: 48height: 48anchors.horizontalCenter: parent.horizontalCentersource: "svg图片路径"ColorOverlay{anchors.fill: imagesource: imagecolor: "red" //修改后的…

TV直播app TV版 超级直播 空壳 可玩性强 带EPG 带回看 带自定义 定制可带自定义协议等

TV直播app 超级直播 空壳 可玩性强 带EPG 带回看 带自定义 定制可带自定义协议等 一、是个空壳,也可以定制二、定制的话,带EPG,带7天回看,甚至可带自定义协议等。三、免责声明 一、是个空壳,也可以定制 可自行导入自己的播放地址…

Qt QDialog更换图标icon

Qt QDialog更换图标icon 1. 如何获取一个.ico文件2. 在项目中更换图标3. 无法定位程序输入点的解决方法 1. 如何获取一个.ico文件 首先向大家推荐一个非常好用的网站:https://www.iconfont.cn/ 这个网站可以免费下载各种图标下载好图标之后,使用图标格式…

QT-纯代码控件-QTabWidget(导航栏切换)

实现一个页面切换功能 1.新建一个无ui界面的工程&#xff0c;其基类为dialog 2.代码实现 dialog.h 添加QTabWidget头文件 #include <QTabWidget>Dialog类中进行私有控件声明 private:QTabWidget * tabWidget;dialog.cpp #include "dialog.h" #include &l…

QT 幸运大转盘动画

想要更多项目私wo!!! 一、项目简介 幸运大转盘的制作其实很简单&#xff0c;幸运大转盘的整体思想是这样&#xff1a; 1.定时器用来刷新大转盘的界面这样就有动态的旋转效果&#xff0c; 2.监听键盘事件&#xff0c;通过键盘控制大转盘的开关&#xff0c;然后…

Qt QTableWidget设置表头、菜单 背景色,以及不成功的原因

Qt QTableWidget设置表头背景色不成功的原因 QTableWidget没有设置背景色的函数&#xff0c;通过Qss样式来设置背景色 m_pTable->horizontalHeader()->setStyleSheet("QHeaderView::section {background-color: QColor(232, 242, 255, 255);}"); 通过QClolor设…

青龙面板-酷狗

酷狗捉包&#xff0c;有人出1元让我抓包&#xff0c;我会收钱吗&#xff01; 授人以鱼不如授人以渔&#xff01;我的运行截图&#xff01; 马上安排教程&#xff08;下期再整个视频教程&#xff09; 拉库地址 ql raw https://gitee.com/jaun920/scripts/raw/master/YM/kgyy.…

Qt实现歌词播放流光跑马灯特效

效果图如下 实现原理 利用Qt的绘制函数&#xff0c;先绘制歌词文案&#xff0c;然后绘制歌词遮罩&#xff0c;歌词遮罩通过定时器计算时长&#xff0c;从而改变遮罩长度&#xff0c;达到效果。 核心代码 //设置歌词内容和启动定时器 void Lrc::startLrcMask(qint64 interval…

Qt的纽带风格界面实现(最新的Office Ribbon风格)

Qt的纽带风格界面实现&#xff08;最新的Office Ribbon风格&#xff09; 之前有朋友已经做了360风格的自定义界面&#xff0c;非常棒&#xff0c;也帮助了不少开发的朋友。近期我也用Qt做了一些界面框架和风格方面的工作&#xff0c;主要是客户端软件采用的OfficeRibbion风格&a…

Qt简单代码修改图标图片颜色

一、前言 通过qt的简单代码实现更改图标颜色&#xff0c;颜色的单一修改填充。 二、代码 实现代码&#xff1a; /* * QIcon icon 待修改的图标 * QColor color 需修改的颜色 * 返回修改后的QIcon */ QIcon mainwindow::setIconColor(QIcon icon, QColor color…

QT代码风格设置

现在记录一下自己思路或者一些常用的知识点&#xff0c;这样以后自己忘记了可以很快查找翻阅一下&#xff0c;可以当个备忘录。同时如果这些东西对其他人有帮助的话&#xff0c;也是特别好的&#xff0c;也会让自己有成就感&#xff0c;给自己更多的前进动力。 这里搜索了很多资…

【实战篇】是时候彻底弄懂BERT模型了(收藏,已修复)

引言 本文是【理论篇】是时候彻底弄懂BERT模型了的姊妹篇。在本文中&#xff0c;我们通过&#x1f917;的transformers库来实战使用预训练的BERT模型。 我们主要会实战文本分类中的情绪识别任务和自然语言推理中的问答任务。 注意&#xff0c;文中提到的嵌入表示、嵌入、嵌入…

【Meta-Al】llama GPT 测试

2023-4-28 更新&#xff1a; github有兄弟合并量化了7B、13B的权重&#xff0c;Chinese-Alpaca项目部署体验更简单&#xff1a; GitHub - ymcui/Chinese-LLaMA-Alpaca: 中文LLaMA&Alpaca大语言模型本地CPU/GPU部署 (Chinese LLaMA & Alpaca LLMs) github地址&#xf…

华为HCIP-DATACOM题库解析

111.RSTP协议中提供了多种保护功能&#xff0c;例如当边缘端口配置为保护状态时&#xff0c;边缘端口接收到BPDU报文后的处理方法是 A:根据要求转发BPDU报文 B:BPDU报文后获取相关信息 C:关闭该端口 D:直接丢弃BPDU报文 C 解析&#xff1a;当边缘端口被设置为保护状态后&am…

华为机考,华为笔试,软件类,2020年8月19日题目,超详细解答。

这次的题目根据身边同学反映普遍较难&#xff0c;仔细看了一下题目其实也并不难&#xff0c;因为都没有涉及比较复杂的算法&#xff0c;但是这次的题目都比较繁琐&#xff0c;写起来比较费时间。 题目一 题目描述&#xff1a; 已知有一堆人排成M行N列&#xff0c;&#xff0…

华为HCIP-DATACOM题库解析(821)61-79

61.当两台优先级相同的设备同时竞争Master角色时&#xff0c;则IP地址较小的接口所在的设备应当被选为Master设备 错误 解析&#xff1a;当两台优先级相同的设备同时竞争Master角色时&#xff0c;则IP地址较大的接口所在的设备应当被选为Master设备 62.VRRP的接口IP地址和虚拟…