**
1、概述
**
**
源码放在文章末尾
**
该项目实现了可交互的创意动态按钮,包含如下功能:
所有颜色自定义
鼠标悬浮渐变
两种点击效果:鼠标点击渐变 / 水波纹动画(可多层波纹叠加)
额外鼠标移入/移出/按下/弹起的实时/延迟共8种事件
鼠标悬浮图标位置主动变化
鼠标拖动图标抖动反弹效果
鼠标进入父控件时开启出现效果,或启动时出现
延迟出现的动画效果(多个按钮连续)
记录开关状态
直接设置 x、y 的圆角显示
边框颜色设置
禁用时半透明+点击穿透效果
添加额外的边缘角标
三种前景模式:图标、文字、带遮罩的图标(任意变色)
支持QSS直接设置部分属性
与父类 QPushButton 兼容
时间准确性:根据时间戳计算动画进度,即使在低性能机器上也可准时完成动画
稳定性:一按钮多功能,完美兼容多种情况下焦点事件
极其强大的可扩展性,继承该按钮后可任意修改显示效果和动画效果
项目demo演示如下所示:
项目部分代码如下所示:
// 设置文本(同QPushButton)voidsetText(QString text);// 设置IconvoidsetIcon(QIcon icon);// 设置Pixmap,会根据 icon_color 自动变色voidsetPixmap(QPixmap pixmap);// 设置额外扩展的角标,比如右边扩展小箭头、右上角标签、左边图标等virtualvoidsetPaintAddin(QPixmap pixmap, Qt::Alignment align = Qt::AlignRight, QSize size =QSize(0,0));// 调整各种动画时长voidsetHoverAniDuration(int d);voidsetPressAniDuration(int d);voidsetClickAniDuration(int d);voidsetWaterAniDuration(int press,int release,int finish);// 是否启用水波纹,false则改为渐变voidsetWaterRipple(bool enable =true);voidsetJitterAni(bool enable =true);// 设置无交互时的背景颜色voidsetBgColor(QColor bg);// 设置hover和press两种状态的背景颜色,与背景叠加// press会和hover以及默认背景再叠加voidsetBgColor(QColor hover, QColor press);// 单独设置各种颜色voidsetNormalColor(QColor color);voidsetBorderColor(QColor color);voidsetHoverColor(QColor color);voidsetPressColor(QColor color);// 设置前景颜色voidsetIconColor(QColor color =QColor(0,0,0));voidsetTextColor(QColor color =QColor(0,0,0));voidsetFocusBg(QColor color);voidsetFocusBorder(QColor color);// 设置字体大小// 如果已设置 setTextDynamicSize(true),那么会有改变动画voidsetFontSize(int f);// 前景对齐方式voidsetAlign(Qt::Alignment a);// 设置圆角voidsetRadius(int r);voidsetRadius(int rx,int ry);// 设置边界宽度(默认0,透明)voidsetBorderWidth(int x);// 分别设置四周空白voidsetPaddings(int l,int r,int t,int b);// 设置水平、垂直空白voidsetPaddings(int h,int v);// 设置四周相同的空白voidsetPaddings(int x);// 设置图标边缘空白比例,0~0.5,越大越空voidsetIconPaddingProper(double x);// 设置鼠标交互时前景(文字/图标)会不会动voidsetFixedForePos(bool f =true);// 设置固定大小;并且会自动选取合适的最小值(adjustMinimumSize())voidsetFixedForeSize(bool f =true,int paddings =0);// 设置为正方形(以高度为准)voidsetSquareSize();// 修改字体时是否显示动画voidsetTextDynamicSize(bool d =true);// 设置鼠标单击松开后是否当做移开// 点击出现菜单的按钮必须设置voidsetLeaveAfterClick(bool l =true);// 启用双击,会响应双击事件,但是单击会有延迟voidsetDoubleClicked(bool e =true);// 动画时是否自动设置文字的颜色,针对派生类的设置,不一定有效voidsetAutoTextColor(bool a =true);// 临时屏蔽hover事件,需要手动关闭(set true->操作->set false)// 比如出现动画,如果一开始鼠标在按钮上,按钮移开,但是hover效果还在,直到鼠标动voidsetBlockHover(bool b =true);// 鼠标进入按钮区域,前景图标从对面方向缩放出现voidsetShowAni(bool enable =true);// 前景从中心点出现的缩放动画voidshowForeground();// 前景从该点对面出现的动画voidshowForeground2(QPoint point =QPoint(0,0));// 隐藏前景,使用 showForeground() 恢复voidhideForeground();// 延迟的 showForeground2()voiddelayShowed(int msecond, QPoint point =QPoint(0,0));// 调整最小大小,很常用voidadjustMinimumSize();voidsetState(bool s =true);boolgetState();// 模拟鼠标点击效果,与鼠标点击作用一样// 会触发 clicked 信号virtualvoidsimulateStatePress(bool s =true,bool a =false);// 该点是否在按钮的范围内virtualboolinArea(QPoint point);
源码下载
版权归原作者 梦回阑珊 所有, 如有侵权,请联系我们删除。