Qt呼吸灯阴影效果

引言

对于输入错误的提示有多种方法,传统一点就是在用户保存设置时校验数据合法性进行弹窗提示。这种方式无需实时校验,对于编码更加友好。但如果站在用户的角度上考虑,上述方式用户在输入时无法得到实时反馈,无法快速知道所输数据的合法性,同时对于设置项较多的配置页来说,仅仅依靠弹窗提示并不能帮助用户快速定位错误项。

针对上述问题,需要对错误项进行标识,通常情况下是对错误项增加红色边框,如下图所示:
在这里插入图片描述

代码实现

单纯为控件增加阴影并不难,但考虑到实际使用中有大量的自定义控件,不可能在所有控件类内编写对应的阴影代码,需要采用装饰者的实现思想,将需要阴影的控件A作为父窗体构造阴影对象,通过控制阴影对象开启关闭,为控件A进行装饰,而不改变控件A类内代码。详细代码如下图所示:

class QPropertyAnimation;
class QGraphicsDropShadowEffect;
class ShadowObject : public QObject
{
    Q_OBJECT
        Q_PROPERTY(int shadowRadius READ borderRadius WRITE setBorderRadius)
public:
    ShadowObject(QWidget* parent);
    ~ShadowObject();

    void startAnimation();
    void stopAnimation();
    void setColor(const QColor & tmpColor);

private:
    QPropertyAnimation* m_animation;
    QGraphicsDropShadowEffect* m_shadowEffect;
    int m_borderRadius;

private:
    int borderRadius() const;
    void setBorderRadius(const int radius);
};
#include <QPropertyAnimation>
#include <QGraphicsDropShadowEffect>

ShadowObject::ShadowObject(QWidget* parent)
    : QObject(parent)
{
    m_shadowEffect = new QGraphicsDropShadowEffect(this);
    m_shadowEffect->setColor(QColor(246,82,82));
    m_shadowEffect->setOffset(0, 0);
    m_shadowEffect->setBlurRadius(0);
    parent->setGraphicsEffect(m_shadowEffect);

    m_animation = new QPropertyAnimation(this);
    m_animation->setTargetObject(this);
    m_animation->setDuration(2000);
    m_animation->setPropertyName("shadowRadius");
    m_animation->setKeyValueAt(0, 2);
    m_animation->setKeyValueAt(0.5, 10);
    m_animation->setKeyValueAt(1, 2);
    m_animation->setLoopCount(-1);
}

ShadowObject::~ShadowObject()
{
    stopAnimation();
}

int ShadowObject::borderRadius() const
{
    return m_borderRadius;
}

void ShadowObject::setBorderRadius(const int radius)
{
    m_borderRadius = radius;
    m_shadowEffect->setBlurRadius(m_borderRadius);
}

void ShadowObject::startAnimation()
{
    m_animation->start();
}

void ShadowObject::stopAnimation()
{
    m_animation->stop();
    m_shadowEffect->setBlurRadius(0);
}

void ShadowObject::setColor(const QColor & tmpColor)
{
    m_shadowEffect->setColor(tmpColor);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arui丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值