Qt动画 QAbstractAnimation
文章目录
- 简介
- QVariantAnimation 数值动画
- QPropertyAnimation 属性动画
- QAnimationGroup 一组动画
- QParallelAnimationGroup 并行动画组
- QSequentialAnimationGroup 串行动画组
简介
QAbstractAnimation 是所有 Qt 动画的基类。
该类定义了所有动画应该都会有的功能函数。
要想实现一个Qt自定义动画,需要继承此类。
一个动画的进度由
currentLoopTime函数给出。
一个动画的进度以毫秒为单位。
动画从0开始,到duration()结束,在动画运行时自动更新进度值。
也可以通过setCurrentTime函数直接定位进度。
一个动画有三个状态,Running,Stopped,Paused.
可以通过start(),stop(),pause(),resume(),来改变状态.
在start()时,动画会重置进度.
如何paused了,在resume()时就会继续进度.
动画Stopped后也可以resume(),就是重头再来.
QAbstractAnimation每次发生状态改变时才会发出stateChanged()信号.
通过
loopCount属性来设置动画的循环次数
动画的默认的loopCount是1
当loopCount是-1时,意味着无限循环
当动画运行到最后一次循环最后一毫秒时才会自动到Stopped状态
Stopped状态时finished()信号将会发出
QAbstractAnimation提供了子类用于跟踪动画进度的纯虚函数:
duration()和updateCurrentTime()
duration()函数允许您报告动画的持续时间
当动画进度变化时,QAbstractAnimation会调用updateCurrentTime(),重写此函数可以跟踪进度。
请注意,既没有定义updateCurrentTime()调用之间的间隔,也没有定义对此函数的调用次数;不过,它通常每秒更新60次。
通过重新实现updateState(),您可以跟踪动画的状态变化,这对于不受时间驱动的动画特别有用。
Qt动画框架

QVariantAnimation 数值动画
QVariantAnimation是对QVariants类型的数值类型执行插值。
QVariants支持的类型如下
- Int
- UInt
- Double
- Float
- QLine
- QLineF
- QPoint
- QPointF
- QSize
- QSizeF
- QRect
- QRectF
- QColor
可以通过setStartValue与setEndValue来设置动画的起点与终点.
当QVariantAnimation执行插值时会发出valueChanged()信号,当然updateCurrentTime()也是会被调用的.
从StartValue到EndValue的变化曲线由setEasingCurve函数与QEasingCurve决定.
例子
#include "VariantAnimationDialog.h"
#include <QVariantAnimation>VariantAnimationDialog::VariantAnimationDialog(QWidget *parent): QDialog(parent)
{ui.setupUi(this);QVariantAnimation* animation = new QVariantAnimation(this);animation->setStartValue(QColor(255, 0, 0));animation->setEndValue(QColor(0, 255, 255));animation->setDuration(2 * 1000);animation->setLoopCount(-1);animation->setEasingCurve(QEasingCurve::OutInBounce);connect(animation, &QVariantAnimation::valueChanged, [this](const QVariant& variant) {QColor color = variant.value<QColor>();this->ui.label->setStyleSheet(QString("background-color: %1").arg(color.name()));});animation->start();}VariantAnimationDialog::~VariantAnimationDialog()
{
}
QPropertyAnimation 属性动画
继承自QVariantAnimation,可以对对象的属性做值变化.
例子
#include "PropertyAnimationDialog.h"
#include <QPropertyAnimation>
#include <QGraphicsDropShadowEffect>PropertyAnimationDialog::PropertyAnimationDialog(QWidget *parent): QDialog(parent)
{ui.setupUi(this);QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect(this);effect->setColor(QColor(0xcc,0xcc,0xcc));effect->setOffset(-17,-17);effect->setBlurRadius(0.0);QPropertyAnimation* animation = new QPropertyAnimation(effect,"blurRadius");ui.pushButton->setGraphicsEffect(effect);animation->setStartValue(10.0);animation->setEndValue(0.0);animation->setDuration(2*1000);animation->setLoopCount(-1);animation->setEasingCurve(QEasingCurve::Linear);animation->start();}PropertyAnimationDialog::~PropertyAnimationDialog()
{
}
QAnimationGroup 一组动画
一组动画里面有多个动画
组动画可以分为并行与串行
QParallelAnimationGroup 并行动画组
并行动画就是字面意思,一组动画是同时运行的。
例子
QPushButton *bonnie = new QPushButton("Bonnie");bonnie->show();QPushButton *clyde = new QPushButton("Clyde");clyde->show();QPropertyAnimation *anim1 = new QPropertyAnimation(bonnie, "geometry");// Set up anim1QPropertyAnimation *anim2 = new QPropertyAnimation(clyde, "geometry");// Set up anim2QParallelAnimationGroup *group = new QParallelAnimationGroup;group->addAnimation(anim1);group->addAnimation(anim2);group->start();
QSequentialAnimationGroup 串行动画组
串行动画就是字面意思,一组动画按顺序依次运行。
例子
QPushButton button("Animated Button");button.show();QPropertyAnimation anim1(&button, "geometry");anim1.setDuration(3000);anim1.setStartValue(QRect(0, 0, 100, 30));anim1.setEndValue(QRect(500, 500, 100, 30));QPropertyAnimation anim2(&button, "geometry");anim2.setDuration(3000);anim2.setStartValue(QRect(500, 500, 100, 30));anim2.setEndValue(QRect(1000, 500, 100, 30));QSequentialAnimationGroup group;group.addAnimation(&anim1);group.addAnimation(&anim2);group.start();
相关文章:
Qt动画 QAbstractAnimation
文章目录 简介QVariantAnimation 数值动画QPropertyAnimation 属性动画 QAnimationGroup 一组动画QParallelAnimationGroup 并行动画组QSequentialAnimationGroup 串行动画组 简介 QAbstractAnimation 是所有 Qt 动画的基类。 该类定义了所有动画应该都会有的功能函数。 要想实…...
SpringMvc的请求-获得请求参数
客户端请求参数的格式是: namevalue&namevalue..… 服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数: 基本类型参数 POJO类型参数 数组类型参数 集合类型参数 获得基本类型参数 Controller中的业务方法…...
flutter开发音乐APP(前提准备)
1、项目的一些环境: 2、接口文档: 酷狗音乐 NodeJS 版 API 3、接口数据结构化 Instantly parse JSON in any language | quicktype UI样式借鉴参考: Coffee-Expert/Apple-Music-New-UI: Apple Music Clone on Flutter, with redesigned UI…...
使用docker搭建redis镜像时云服务器无法访问到国外的docker官网时如何解决
下载redis镜像 docker redis:版本号 此时截图中无法访问到国外的docker官网 解决方案: 通过更换镜像源来正常下载redis镜像 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<EOF {"registry-mirrors": ["https://docker.1…...
双引擎驱动:解密音视频体验的QoS技术底座与QoE感官革命
QoS 定义:QoS(Quality of Service,服务质量)衡量音视频传输技术层面的性能表现,聚焦网络传输和系统处理能力,通过客观指标量化服务质量。核心指标 码率/带宽:数据传输速率上限,直接…...
Qt之QNetworkInterface
简介 用于表示网络接口(即网卡)信息 常用接口 static QList<QNetworkInterface> allInterfaces(); static QList<QHostAddress> allAddresses(); QList<QNetworkAddressEntry> addressEntries() const;接口类型 用枚举InterfaceTy…...
pom导包成功,但是就是无法使用相关类,同时报错:Library:Maven ‘xxx‘ has broken path
开发环境:Intellij 2023 一、问题记录 在maven工程的pom文件导入如下某一依赖(JGit)。没有显示导包的错误,同时在maven仓库里面找到对应的包是正常下载到相应jar的。 但是就是无法引入相关的类。打开Project Structure,在Dependencies中发现…...
大数据技术之Scala
Spark运行架构核心是一个计算引擎 核心组件 1. Driver(驱动器) 角色:Spark作业的“大脑”,负责解析用户代码、生成任务并调度执行。 功能: 将用户程序转换为作业(Job)。 …...
LeetCode刷题常见的Java排序
1. 字符串排序(字母排序) 首先,你的代码实现了根据字母表顺序对字符串中的字母进行排序,忽略了大小写并且保留了非字母字符的位置。关键点是: 提取和排序字母:通过 Character.isLetter() 判断是否为字母,并利用 Character.toLowerCase() 来忽略大小写进行排序。保留非字…...
mysql的下载和安装2025.4.8
mysql下载和安装 MySQL的下载网址: https://www.mysql.com/downloads/ 点击进入Windows版本下载:我们可以选择需要的MySQL版本以及所需的操作系统,这里选择离线安装: 注意:MySQL 8.0 是带有 MySQL Installer 的最后一…...
QML Loader:延迟加载与动态切换
目录 引言相关阅读工程结构LoaderDelay.qml - 延迟加载实现完整代码HeavyComponent.qml代码解析运行效果 LoaderSwitch.qml - 动态切换组件完整代码代码解析运行效果 Main.qml - 主界面实现完整代码主界面结构代码解析 总结下载链接 引言 QML的Loader组件提供了一种强大的机制…...
Python和MicroPython的解释器区别
Python和MicroPython的解释器不是同一个,它们在设计目标、实现方式和运行环境上都有显著的区别。以下是它们的主要区别: 1. 底层实现 Python解释器(CPython): Python的标准解释器是CPython(C语言实现的Pyt…...
Git 的进阶功能和技巧
1、分支的概念和使用 1.1、什么是分支? 分支(Branch)是在版本控制中非常重要的概念。几乎所有版本控制系统都支持某种形式的分支。在 Git 中,分支是 Git 强大功能之一,它允许我们从主开发线分离出来,在不…...
解析HiveQL的ALTER TABLE ADD/REPLACE COLUMNS语句
阅读以下ALTER TABLE的ADD/REPLACE COLUMNS语句的语法,用C#编写解析函数,一个一个字符解析,所有关键字不区分大小写,一个或多个空格、Tab和换行的组合都可以是关键词之间的分隔,表名和字段名可能包含空格和Tab,语句中可以用`包裹表名和字段名,解析以下HiveQL语句在所有可…...
Spark Core编程
一 Spark 运行架构 1 运行架构 定义 Spark 框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构 如图所示 2 核心组件 Spark 框架有两个核心组件: 1)Driver 2)Spark 驱动器节点(用于执行 Spark 任务中的 main 方法&…...
在Ubuntu内网环境中为Gogs配置HTTPS访问(通过Apache反向代理使用IP地址)
一、准备工作 确保已安装Gogs并运行在HTTP模式(默认端口3000) 确认服务器内网IP地址(如192.168.1.100) 二、安装Apache和必要模块 sudo apt update sudo apt install apache2 -y sudo a2enmod ssl proxy proxy_http rewrite headers 三、创建SSL证书 1. 创建证书存储目录…...
Kafka和RocketMQ相比有什么区别?那个更好用?
Kafka和RocketMQ相比有什么区别?那个更好用? Kafka 和 RocketMQ 都是广泛使用的消息队列系统,它们有很多相似之处,但也有一些关键的区别。具体选择哪个更好用,要根据你的应用场景和需求来决定。以下是它们之间的主要区别: 1. …...
无人机装调与测试
文章目录 前言一、无人机基本常识/预备知识(一)无人机飞行原理无人机硬件组成/各组件作用1.飞控2.GPS3.接收机4.电流计5.电调6.电机7.电池8.螺旋桨9.UBEC(稳压模块) (二)飞控硬件简介(三&#x…...
JavaScript Hook JSON.stringify和JSON.parse:逆向与修改实战指南
在JavaScript逆向工程中,Hook JSON.stringify和JSON.parse方法是一种重要的技术,可以用来捕获、修改或分析JSON数据的序列化和反序列化过程。本文将结合具体案例,详细讲解如何实现这些方法的Hook操作。 一、Hook JSON.stringify和JSON.parse…...
【图书管理系统】全栈开发图书管理系统获取图书列表接口(后端:计算图书页数、查询当前页展示的书籍)
图书列表 实现服务器代码(计算图书总数量查询当前页需要展示的书籍) 后端响应时,需要响应给前端的数据 records:第 pageNum 页要展示的图书有哪些(存储到List集合中)total:计算一共有多少本书(用于告诉前…...
正则表达式补充——python
简介 本章是对前面正则表达式的补充。 一、复杂的查找替换等任务 content 张三是脑卒中病 李四,是高血脂 苏齐,是肺结核病 六六,是血血血血import re p re.compile(r...病) for one in p.findall(content):print(one) 运行结果…...
Kotlin日常使用函数记录
文章目录 前言字符串集合1.两个集合的差集2.集合转数组2.1.集合转基本数据类型数组2.2.集合转对象数组 Map1.合并Map1.1.使用 操作符1.2.使用 操作符1.3.使用 putAll 方法1.4.使用 merge 函数 前言 记录一些kotlin开发中,日常使用的函数和方式之类的,…...
Android 回答视频边播放边下载的问题
分层次的回答突出 技术深度、架构思维 和 实战优化,从基础实现到高阶优化: 一、核心技术方案(基础回答) 如何实现视频边下边播? 1. **网络请求**:使用 HTTP Range 请求(Header: Range: bytes0…...
RHCSA Linux系统 数据流和重定向 tee 命令
一.数据流和重定向 1. 数据流 (1) 标准输入(stdin,代码 0):默认从键盘获取输入,只读。 (2) 标准输出(stdout,代码 1):命令执行正确信息默认输出到屏幕,只写…...
[ctfshow web入门] web7
信息收集 题目提示:版本控制很重要,但不要部署到生产环境更重要。 那么很有可能,版本控制相关的信息被部署到环境了,比如比如version.txt记录了一些相关配件的版本,git版本管理工具中的.git文件夹未删除 信息收集就是…...
DeepSeek-V3 API:开启下一代AI应用开发的新篇章
引言 在人工智能技术日新月异的今天,大型语言模型(LLM)正以前所未有的速度改变着我们与技术互动的方式。DeepSeek-V3作为国内领先的大语言模型之一,其API的开放为开发者提供了强大的AI能力集成方案。 DeepSeek-V3 API的核心优势 1.强大的语言理解与生…...
华为数字芯片机考2025合集3已校正
1. 题目内容 下列说法正确的是()。 1. 解题步骤 1.1 选项分析 选项描述正误依据A异步 FIFO 采用格雷码是为了省功耗✗格雷码用于消除多比特信号跨时钟域的位跳变风险,与功耗无关B单比特信号打两拍可以完全避免亚稳态✗双触发器同步仅降低…...
控制 ElementUI el-table 树形表格多选框的显示层级
1、你可以通过 selectable 属性来控制哪些行可以选择(显示多选框) <el-table:data"tableData"row-key"id"default-expand-all:tree-props"{children: children, hasChildren: hasChildren}"select"handleSelect&…...
go语言应该如何学习
以下是学习Go语言的高效路径及关键技巧,结合多个优质来源整理而成,适合不同基础的学习者: 一、基础语法快速入门(1-2周) 1、环境搭建 下载安装Go SDK,配置GOPATH和GOROOT环境变量,推荐使用Go…...
NO.84十六届蓝桥杯备战|动态规划-路径类DP|矩阵的最小路径和|迷雾森林|过河卒|方格取数(C++)
路径类dp是线性dp的⼀种,它是在⼀个nm的矩阵中设置⼀个⾏⾛规则,研究从起点⾛到终点的⽅案数、最⼩路径和或者最⼤路径和等等的问题 矩阵的最小路径和_牛客题霸_牛客网 状态表⽰: dp[i][j]表⽰:到达[i, j]位置处,最⼩…...
