引言
对于输入错误的提示有多种方法,传统一点就是在用户保存设置时校验数据合法性进行弹窗提示。这种方式无需实时校验,对于编码更加友好。但如果站在用户的角度上考虑,上述方式用户在输入时无法得到实时反馈,无法快速知道所输数据的合法性,同时对于设置项较多的配置页来说,仅仅依靠弹窗提示并不能帮助用户快速定位错误项。
针对上述问题,需要对错误项进行标识,通常情况下是对错误项增加红色边框,如下图所示:
代码实现
单纯为控件增加阴影并不难,但考虑到实际使用中有大量的自定义控件,不可能在所有控件类内编写对应的阴影代码,需要采用装饰者的实现思想,将需要阴影的控件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);
}