《QT实用小工具·四十七》可交互的创意动态按钮

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

该项目实现了可交互的创意动态按钮,包含如下功能:
所有颜色自定义
鼠标悬浮渐变
两种点击效果:鼠标点击渐变 / 水波纹动画(可多层波纹叠加)
额外鼠标移入/移出/按下/弹起的实时/延迟共8种事件
鼠标悬浮图标位置主动变化
鼠标拖动图标抖动反弹效果
鼠标进入父控件时开启出现效果,或启动时出现
延迟出现的动画效果(多个按钮连续)
记录开关状态
直接设置 x、y 的圆角显示
边框颜色设置
禁用时半透明+点击穿透效果
添加额外的边缘角标
三种前景模式:图标、文字、带遮罩的图标(任意变色)
支持QSS直接设置部分属性
与父类 QPushButton 兼容
时间准确性:根据时间戳计算动画进度,即使在低性能机器上也可准时完成动画
稳定性:一按钮多功能,完美兼容多种情况下焦点事件
极其强大的可扩展性,继承该按钮后可任意修改显示效果和动画效果

项目demo演示如下所示:
在这里插入图片描述
项目部分代码如下所示:

// 设置文本(同QPushButton)
void setText(QString text);// 设置Icon
void setIcon(QIcon icon);// 设置Pixmap,会根据 icon_color 自动变色
void setPixmap(QPixmap pixmap);// 设置额外扩展的角标,比如右边扩展小箭头、右上角标签、左边图标等
virtual void setPaintAddin(QPixmap pixmap, Qt::Alignment align = Qt::AlignRight, QSize size = QSize(0, 0));// 调整各种动画时长
void setHoverAniDuration(int d);
void setPressAniDuration(int d);
void setClickAniDuration(int d);
void setWaterAniDuration(int press, int release, int finish);
// 是否启用水波纹,false则改为渐变
void setWaterRipple(bool enable = true);
void setJitterAni(bool enable = true);// 设置无交互时的背景颜色
void setBgColor(QColor bg);
// 设置hover和press两种状态的背景颜色,与背景叠加
// press会和hover以及默认背景再叠加
void setBgColor(QColor hover, QColor press);
// 单独设置各种颜色
void setNormalColor(QColor color);
void setBorderColor(QColor color);
void setHoverColor(QColor color);
void setPressColor(QColor color);// 设置前景颜色
void setIconColor(QColor color = QColor(0, 0, 0));
void setTextColor(QColor color = QColor(0, 0, 0));
void setFocusBg(QColor color);
void setFocusBorder(QColor color);// 设置字体大小
// 如果已设置 setTextDynamicSize(true),那么会有改变动画
void setFontSize(int f);// 前景对齐方式
void setAlign(Qt::Alignment a);// 设置圆角
void setRadius(int r);
void setRadius(int rx, int ry);// 设置边界宽度(默认0,透明)
void setBorderWidth(int x);// 分别设置四周空白
void setPaddings(int l, int r, int t, int b);
// 设置水平、垂直空白
void setPaddings(int h, int v);
// 设置四周相同的空白
void setPaddings(int x);
// 设置图标边缘空白比例,0~0.5,越大越空
void setIconPaddingProper(double x);// 设置鼠标交互时前景(文字/图标)会不会动
void setFixedForePos(bool f = true);
// 设置固定大小;并且会自动选取合适的最小值(adjustMinimumSize())
void setFixedForeSize(bool f = true, int paddings = 0);
// 设置为正方形(以高度为准)
void setSquareSize();// 修改字体时是否显示动画
void setTextDynamicSize(bool d = true);// 设置鼠标单击松开后是否当做移开
// 点击出现菜单的按钮必须设置
void setLeaveAfterClick(bool l = true);// 启用双击,会响应双击事件,但是单击会有延迟
void setDoubleClicked(bool e = true);// 动画时是否自动设置文字的颜色,针对派生类的设置,不一定有效
void setAutoTextColor(bool a = true);// 临时屏蔽hover事件,需要手动关闭(set true->操作->set false)
// 比如出现动画,如果一开始鼠标在按钮上,按钮移开,但是hover效果还在,直到鼠标动
void setBlockHover(bool b = true);// 鼠标进入按钮区域,前景图标从对面方向缩放出现
void setShowAni(bool enable = true);
// 前景从中心点出现的缩放动画
void showForeground();
// 前景从该点对面出现的动画
void showForeground2(QPoint point = QPoint(0, 0));
// 隐藏前景,使用 showForeground() 恢复
void hideForeground();
// 延迟的 showForeground2()
void delayShowed(int msecond, QPoint point = QPoint(0, 0));// 调整最小大小,很常用
void adjustMinimumSize();void setState(bool s = true);
bool getState();// 模拟鼠标点击效果,与鼠标点击作用一样
// 会触发 clicked 信号
virtual void simulateStatePress(bool s = true, bool a = false);// 该点是否在按钮的范围内
virtual bool inArea(QPoint point);

源码下载

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

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

相关文章

$nextTick源码解析

this.$nextTick 是 Vue.js 内部使用的一个方法,用于在下一个 DOM 更新循环结束之后执行回调函数。 原理: nextTick 方法被调用后,会将回调函数存储在一个队列中Vue.js 会利用浏览器的异步队列机制,在 DOM 更新循环结束后执行这个队列中的所有回调函数。源码: /*** Defer…

51单片机两个中断及中断嵌套

文章目录 前言一、中断嵌套是什么?二、两个同级别中断2.1 中断运行关系2.2 测试程序 三、两个不同级别中断实现中断嵌套3.1 中断运行关系3.2 测试程序 总结 前言 提示:这里可以添加本文要记录的大概内容: 课程需要: 提示&#x…

德国著名自动化公司Festo设计了一款仿生蜜蜂,仅重34g,支持多只蜜蜂编队飞行!...

德国著名的气动元件研发及自动化解决方案供应商Festo公司近日展示了一款仿生蜜蜂(BionicBee),重量只有34g,却完全可以实现自主飞行,还支持多只相同的蜜蜂机器人编队飞行。 BionicBee 重约 34 克,长 22 厘米…

Android配置环境

安装jdk: 1.在Android 中文社区下载sdk:android-sdk_r24.4.1-linux.tgz下载jdk,解压 sudo mv /home/用户名/Downloads/jdk1.8.0_271 /usr/java 配置环境变量: 执行命令:sudo gedit /etc/profile 此命令是打开profil…

面试题:spring和mybatis整合之后为什么一级缓存会失效?

答案 一级缓存使用者可以随时使用或者销毁缓存,从SqlSession对象打开时缓存就已经存在。当关闭SqlSession对象缓存就失效。 当与spring整合的时候,直接跳过SqlSession对象,无法直接操作到SqlSession对象,spring在操作SqlSession的…

python安装cx_Oracle 遇到的问题

重要: 搞了一天,最后发现是python的版本和cx_Oracle版本对不上。 一开始安装的python版本是3.12,而cx_Oracle的最新版本是8.3.0, 对应的python版本为3.10,因此将python版本降低为3.10, 执行 pip install cx…

docker打包容器为镜像

要使用Docker将容器打包成镜像,你需要执行以下步骤: 创建一个Dockerfile,定义如何构建你的镜像。 使用docker build命令来创建镜像。 以下是一个简单的示例: 首先,创建一个名为Dockerfile的文件,内容如…

Redis线程模型及性能优化概述

redis线程模型: 网络模块命令处理 redis的性能: 一个取决于物理内存,另一个是对于socket请求的处理速度。 4.0以前 单线程模式 请求流程:对于一个请求,线程会根据操作产生相应的事件(读,写事…

基于Springboot的水产养殖系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的水产养殖系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…

【MyBatis】进阶使用 (动态SQL)

动态SQL \<if>\<trim>\<where>\<set>\<foreach>\<include> 在填写表单时&#xff0c;有些数据是非必填字段&#xff08;例如性别&#xff0c;年龄等字段&#xff09;&#xff0c;那就需要在接收到参数时判断&#xff0c;根据参数具体的情况…

【知识学习/复习】损失函数篇,包含理解应用与分类:回归、分类、排序、生成等任务

损失函数总结 一、损失函数理解二、不同任务的损失函数的应用1.图像分类2.目标检测3.语义分割4.自然语言处理&#xff08;NLP&#xff09;5.图神经网络&#xff08;GNN&#xff09;6.生成式网络 三、损失函数1. 回归任务损失函数常见损失函数IoU系列损失函数1. IoU损失函数&…

TiDB 利用binlog 恢复-反解析binlog

我们知道TiDB的binlog记录了所有已经执行成功的dml语句&#xff0c;类似mysql binlog row模式 &#xff0c;TiDB官方也提供了reparo可以进行解析binlog&#xff0c;如下所示: [2024/04/26 20:58:02.136 08:00] [INFO] [config.go:153] ["Parsed start TSO"] [ts449…

聊天窗口关键词回复、定时发送、获取手机号发送到服务器

代码逻辑介绍&#xff1a; isUserTyping记录用户是否输入消息&#xff0c;用setInterval定时50秒检测并改变用户状态为false&#xff0c;发送消息、或者自动打印一轮完毕后&#xff0c;置为true。 sendMessage是处理发送消息的函数&#xff1b; appendMessage是将消息追加到…

[C++][数据结构]二叉搜索树:介绍和实现

二叉搜索树 概念 二叉搜索树又称二叉排序树&#xff0c;它是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左右子树也…

IoT Scenario: Smart Retail System-Multiple Sources and Multiple Terminals

物联网/大数据可视化领域发文可以联系&#xff1a;nascimsina.com IoT Scenario: Smart Retail System Overview The use of IoT in the retail industry enhances customer experiences, optimizes inventory management, and provides valuable insights into consumer beh…

Vue+ElementUI实现文件照片音频视频预览

1. 需求是点击预览按钮 根据文件名的后缀去实现预览 2. 具体实现代码及逻辑 1.预览弹框 <el-dialog:visible.sync"visibleFile"width"40%":close-on-click-modal"false"close"cancelHandler":append-to-body"true">…

【架构】后端项目如何分层及分层领域模型简化

文章目录 一. 如何分层1. 阿里规范2. 具体案例分析 二. 分层领域模型的转换1. 阿里规范2. 模型种类简化分析 三. 小结 本文描述后端项目中如何进行分层&#xff0c;以及分层领域模型简化 一. 如何分层 1. 阿里规范 阿里的编码规范中约束分层逻辑如下: 开放接口层&#xff1a…

pinia持久化

安装 pinia-plugin-persistedstate npm i pinia-plugin-persistedstate main.ts import App from ./App.vue import { createPersistedState } from pinia-plugin-persistedstate import { createPinia } from piniaconst pinia createPinia() pinia.use(createPersistedSt…

Java全栈开发前端+后端(全栈工程师进阶之路)-环境搭建

在课程开始前我们要配置好我们的开发环境&#xff0c;这里我的电脑太乱了&#xff0c;我使用vm虚拟机进行搭建开发环境&#xff0c;如果有需要环境的或者安装包&#xff0c;可以私信我。 那我们开始 首先我们安装数据库 这里我们使用小皮面板 小皮面板(phpstudy) - 让天下没…

【计算机毕业设计】基于SSM++jsp的社区管理与服务系统【源码+lw+部署文档+讲解】

目录 摘 要 Abstract 第一章 绪论 第二章 系统关键技术 第三章 系统分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3运行可行性 3.1.4法律可行性 3.4.1注册流程 3.4.2登录流程 3.4.3活动报名流程 第四章 系统设计 4.3.1登录模块顺序图 4.3.2添加信息模块顺序图 4.4.1 数据库E-…