当前位置: 首页 > news >正文

《QT实用小工具·六十五》基于QPropertyAnimation实现的移动动画和控件覆盖

1、概述
源码放在文章末尾

该项目基于QPropertyAnimation实现了控件平移动画和控件之间的相互覆盖效果,项目demo演示如下所示:
在这里插入图片描述

项目解析:

new QPropertyAnimation(ui.SingleOcclusion, “pos”); //创建动画对象,第一个参数传入需要移动的控件对象,第二个参数"pos"表示该控件实现直线移动。
信号槽表示动画移动结束会发送finished信号。

pPosAnimation1 = new QPropertyAnimation(ui.SingleOcclusion, "pos");
pBothPosAnimation1 = new QPropertyAnimation(ui.BothOcclusion, "pos");
connect(pPosAnimation1, &QPropertyAnimation::finished, this, &SlidingAnimation::OcclusionAnimation);
connect(pBothPosAnimation1, &QPropertyAnimation::finished, this, &SlidingAnimation::BothOcclusionAnimation);

控件左移动实现,右移动和双边移动同理

void SlidingAnimation::on_left_clicked()
{ui.BothOcclusion->hide();QTime time;time.start();while (time.elapsed() < 100){QCoreApplication::processEvents();_sleep(100);}//每次移动前先取消控件的透明度设置pButtonOpacity->setOpacity(1);ui.SingleOcclusion->setGraphicsEffect(pButtonOpacity);//这里的处理是因为布局中的控件在动画移动后如果界面发生改变会重新布局,这样移动//后的控件会回到原来的位置,这里是让控件移动结束后一直停留在移动后的位置QLayoutItem* item = ui.horizontalLayout_2->itemAt(3);if ((int)item->spacerItem() == (int)spacerLeft){ui.horizontalLayout_2->removeItem(spacerLeft);ui.horizontalLayout_2->insertWidget(3, ui.SingleOcclusion);}QRect line = ui.line_4->geometry();QRect label = ui.leftLabel->geometry();QRect widget = ui.SingleOcclusion->geometry();int difference = (widget.width() - label.width()) / 2;//设置动画移动时间pPosAnimation1->setDuration(1000);//设置动画开始移动的位置pPosAnimation1->setStartValue(QPoint(line.x() + line.width(), widget.y()));//设置动画移动结束的位置pPosAnimation1->setEndValue(QPoint(label.x() - difference, widget.y()));pPosAnimation1->setEasingCurve(QEasingCurve::InOutQuad);// 开始动画前移除widget,并添加占位符ui.horizontalLayout_2->removeWidget(ui.SingleOcclusion);ui.horizontalLayout_2->insertItem(3, spacerLeft);pPosAnimation1->start();
}

该函数为动画结束后信号触发的槽函数,主要实现的功能是当控件移动结束后覆盖到另一个控件的上方并设置该控件的透明度

void SlidingAnimation::OcclusionAnimation()
{QRect widget = ui.SingleOcclusion->geometry();ui.SingleOcclusion->move(widget.x(), widget.y());pButtonOpacity->setOpacity(1);ui.SingleOcclusion->setGraphicsEffect(pButtonOpacity);QPropertyAnimation* pOpacityAnimation1 = new QPropertyAnimation(pButtonOpacity, "opacity");pOpacityAnimation1->setDuration(600);pOpacityAnimation1->setStartValue(1);pOpacityAnimation1->setEndValue(0.3);pOpacityAnimation1->start();
}

源码下载

相关文章:

  • 内网安全之搭建ADCS证书服务
  • C++ 时间处理-从字符串中解析日期时间
  • 中银基金软件开发工程师春招群面记录
  • 网络安全之BGP详解
  • 通过管理系统完成商品属性维护
  • vue3 + antd-vue@4 a-table单元格合并,rowSpan(行合并),colSpan(列合并)详解, 表头合并详解, 表头自定义详解
  • docker 配置文件使用经验,后续持续增加
  • 设计模式7——建造者模式
  • 保护共享资源的方法(互斥锁)
  • Spring框架中获取方法参数名称:DefaultParameterNameDiscoverer
  • 开发人员容易被骗的原因有很多,涉及技术、安全意识、社会工程学以及工作环境等方面。以下是一些常见原因:
  • 揭秘指针魔法,让你的编程之旅如虎添翼!‍♂️✨
  • 赶紧收藏!2024 年最常见 20道 Redis面试题(三)
  • 前端 CSS 经典:好看的标题动画
  • 深度学习之基于YOLOV5的口罩检测系统
  • [译]Python中的类属性与实例属性的区别
  • css属性的继承、初识值、计算值、当前值、应用值
  • flask接收请求并推入栈
  • github指令
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Java超时控制的实现
  • leetcode388. Longest Absolute File Path
  • markdown编辑器简评
  • MobX
  • Python学习之路13-记分
  • ReactNative开发常用的三方模块
  • SQLServer之创建数据库快照
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 前端
  • 前端面试题总结
  • 算法系列——算法入门之递归分而治之思想的实现
  • 我的业余项目总结
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 智能合约Solidity教程-事件和日志(一)
  • HanLP分词命名实体提取详解
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ###STL(标准模板库)
  • #HarmonyOS:基础语法
  • #NOIP 2014# day.2 T2 寻找道路
  • #pragma once
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (4)事件处理——(7)简单事件(Simple events)
  • (k8s中)docker netty OOM问题记录
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (十一)手动添加用户和文件的特殊权限
  • (译) 函数式 JS #1:简介
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net下简单快捷的数值高低位切换
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • :如何用SQL脚本保存存储过程返回的结果集
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...