为了满足工作中控件多样性的要求,一些控件的风格需要通过重写画家事件的方式进行自定义;
实现sink风格按钮的效果图如下:
纯代码实现思路:
产生按钮下沉的效果是利用了视觉误差原理,通过更改背景颜色以及图标的位置,呈现出按钮动态改变的效果。
按钮未按下状态绘制代码:
void SinkButton::drawUnSinkRect(QPainter *painter)
{
painter->save();
QBrush brush;
brush.setColor(mReleaBgColor);
brush.setStyle(Qt::SolidPattern);
painter->setBrush(brush);
painter->drawRect(0,0,width(),height());
QPen pen;
pen.setColor(mInterColor);
pen.setWidth(mWidth*2);
painter->setPen(pen);
painter->drawLine(width(),0,width(),height());
painter->drawLine(0,height(),width(),height());
pen.setColor(Qt::white);
painter->setPen(pen);
pen.setWidth(0);
painter->drawLine(0,0,width(),0);
painter->drawLine(0,0,0,height());
pen.setColor(Qt::black);
pen.setWidth(0);
painter->setPen(pen);
painter->drawLine(width(),0,width(),height());
painter->drawLine(0,height(),width(),height());
painter->restore();
}
按钮按下状态代码:
void SinkButton::drawSinkedRect(QPainter *painter)
{
painter->save();
QBrush brush;
brush.setColor(mPressBgColor);
brush.setStyle(Qt::SolidPattern);
painter->setBrush(brush);
painter->drawRect(0,0,width(),height());
QPen pen;
pen.setColor(Qt::white);
painter->setPen(pen);
painter->drawLine(width(),0,width(),height());
painter->drawLine(0,height(