最近做了一个提示框消失的功能,觉着挺有意思,以前一直以为Qt子窗口不能做淡出效果,其实Qt的淡出功能已经帮我们封装好了,我们仅仅只需要几行代码就可以做出酷炫的窗口关闭效果,写此篇文章的时候,我特意浏览了下之前写的两篇文章(QPainterPath不规则提示框,QPainterPath不规则提示框(二)),现在回想起来那会儿确实知之甚少,关于顶层窗口不能做圆角,其实帮助文档里已经说的很明确,解决办法有多种,一种是重写paintEvent函数,另一种是把小部件包装一层,本篇文章就用的是后一种方式,如图1所示窗口关闭动画,实例程序中做了淡出,飞出,缩小等关闭窗口动画,除此之外还包含了阴影,背景着色,滤镜等特效。
图1窗口特效
如图1窗口特效所示,实例中总共包含了4个groupbox,这4个groupbox是分别用来展示不同特效、下面分别讲述4个groupbox
-
<李>背景色:主要针对窗口背景色进行了定制,就像groupbox中按钮文字那样,是红色和绿色的背景提示框,其中红色提示框使用了最小化关闭效果,绿色提示框使用了淡出特效李>
<李>飞出:这4个按钮弹出的对话框都使用了飞出特效,4个按钮分别展示了4种飞出的方式(左、上、右、下)李>
<李>自定义:支持自定义提示框别景色,提示框展示时长,消失动画时长和消失模式李>
<李>快捷方式:主要是针对业务进行的功能定制,警告提示框体的图标是进行单独处理的,是一个叹号图标李>
在讲解代码之前,先来认识几个概念
-
<李> QPropertyAnimation:属性动画,可以参考qt窗口动画李>
<李> QGraphicsOpacityEffect:窗口透明度设置类,继承自QGraphicsEffect李>
<李> QGraphicsDropShadowEffect:窗口阴影,继承自QGraphicsEffect李>
<李> QGraphicsBlurEffect:滤镜,继承自QGraphicsEffect李>
<李> QGraphicsColorizeEffect:着色,继承自QGraphicsEffect李>
1,移出动画,使用属性动画QPropertyAnimation类进行,propertyname的参数是窗口的属性,详情参见Q_PROPERTY属性.targetObject对象设置为这内部单独封装的小部件,这样做的目的使得该提示框不需要依赖其他窗口遮挡即可做出飞出效果
空白GMPOperateTip:时差() { m_pAnimation→setTargetObject (m_pMoveWidget); m_pAnimation→setPropertyName (pos); m_pAnimation→setStartValue (QPoint ()); 开关(m_eDirection) { 案例D_LEFT: m_pAnimation→setEndValue (QPoint (width (), 0)); 打破; 案例D_TOP: m_pAnimation→setEndValue (QPoint(0,高度())); 打破; 案例D_RIGHT: m_pAnimation→setEndValue (QPoint(宽度(),0)); 打破; 案例D_BOTTOM: m_pAnimation→setEndValue (QPoint(0,身高())); 打破; 默认值: ; } }
2,淡出
m_pOpacity=new QGraphicsOpacityEffect(这个); m_pOpacity→setOpacity (1); setGraphicsEffect (m_pOpacity); m_pAnimation→setTargetObject (m_pOpacity); m_pAnimation→setPropertyName(“不透明度”); m_pAnimation→setStartValue (1); m_pAnimation→setEndValue (0);
3,最小化
m_pAnimation→setPropertyName(“几何”); QRect startRect=矩形(); startRect.moveTo (pos ()); QRect stopRect=QRect (startRect.center (), QSize (0, 0)); m_pAnimation→setStartValue (startRect); m_pAnimation→setEndValue (stopRect);
4,动画启动机制
使用定时器控制动画,当指定时间后启动动画,并且在动画完成后关闭窗口
空白InitializeConnect () { m_pAnimation=new QPropertyAnimation(这个); m_pAnimation→setTargetObject(这个); 连接(m_pAnimation, QPropertyAnimation:完了,,,GMPOperateTip::关闭); 连接(及m_StayTimer, QTimer::超时,这一点,[这]{ m_pAnimation→setDuration (m_DurationTime); 开关(m_eMode) { 案例AM_FADEOUT: FadeOut_p (); 打破; 案例AM_FLYOUT: 时差(); 打破; 案例AM_ZOOMIN: ZoomIn (); 打破; 默认值: ; } m_pAnimation→开始(); }); }