点击查看详细介绍
头文件
#ifndef SPINBOX_STYLE_1_H
#define SPINBOX_STYLE_1_H
#include <QProxyStyle>
#include <QStyleOptionComplex>
#include <QPainter>
class spinbox_1 : public QProxyStyle
{
Q_OBJECT
public:
spinbox_1();
~spinbox_1();
public:
void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = 0) const;
void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const;
QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc, const QWidget *widget) const;
private:
void drawSpinBox(SubControl sc,const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = 0)const;
};
#endif // SPINBOX_STYLE_1_H
cpp
#include "spinbox_style_1.h"
#include <QDebug>
spinbox_1::spinbox_1()
{
}
spinbox_1::~spinbox_1()
{
}
void spinbox_1::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const
{
if(control == CC_SpinBox)
{
drawSpinBox(SC_SpinBoxDown,option,painter,widget);
drawSpinBox(SC_SpinBoxUp,option,painter,widget);
QRect editFiled = subControlRect(CC_SpinBox,option,SC_SpinBoxEditField,widget).adjusted(-10,-10,+10,+10);
painter->save();
QLinearGradient ga(0,0,editFiled.width(),editFiled.height());
ga.setColorAt(0.0,QColor("#381FE4"));
ga.setColorAt(1.0,QColor("#99EC93"));
painter->setBrush(ga);
painter->setPen(Qt::NoPen);
int diameter =12;
QRect roundRect = editFiled.adjusted(1,1,-1,-1);
int cx = 100 * diameter / roundRect.width();
int cy = 100 * diameter / roundRect.height();
painter->drawRoundedRect(roundRect,cx,cy);//绘制编辑框四周
painter->restore();
QRect frameRect = subControlRect(CC_SpinBox,option,SC_SpinBoxFrame,widget);
painter->save();
painter->setPen(QPen(QColor(Qt::blue),2));
painter->drawRect(frameRect);//绘制SpinBox外围边框
painter->restore();
}
else
{
QProxyStyle::drawComplexControl(control,option,painter,widget);
}
}
void spinbox_1::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
{
if(element == PE_IndicatorSpinPlus)
{
painter->save();
painter->translate(option->rect.x(),option->rect.y());
QPainterPath pa;
pa.moveTo(option->rect.width()/2,0);
pa.lineTo(0,option->rect.height());
pa.lineTo(option->rect.width(),option->rect.height());
pa.lineTo(option->rect.width()/2,0);
painter->setPen(QPen(QColor("#128bf1"), 2));
painter->drawPath(pa);
painter->restore();
return;
}
else if(element == PE_IndicatorSpinMinus)
{
painter->save();
painter->translate(option->rect.x(),option->rect.y());
QPainterPath pa;
pa.moveTo(0,0);
pa.lineTo(option->rect.width(),0);
pa.lineTo(option->rect.width()/2,option->rect.height());
pa.lineTo(0,0);
painter->setPen(QPen(QColor("#128bf1"), 2));
painter->drawPath(pa);
painter->restore();
return;
}
return QProxyStyle::drawPrimitive(element,option,painter,widget);
}
QRect spinbox_1::subControlRect(QStyle::ComplexControl cc, const QStyleOptionComplex *opt, QStyle::SubControl sc, const QWidget *widget) const
{
if(cc == CC_SpinBox)
{
switch (sc) {
case SC_SpinBoxUp:
return QRect(opt->rect.x(),0,opt->rect.width()/2,opt->rect.height()*0.4).adjusted(1,1,-1,-1);
case SC_SpinBoxDown:
return QRect(opt->rect.width()/2,0,opt->rect.width()/2,opt->rect.height()*0.4).adjusted(1,1,-1,-1);
case SC_SpinBoxEditField:
return QRect(opt->rect.x(),opt->rect.height()*0.4,opt->rect.width(),opt->rect.height()*0.6).adjusted(10,10,-10,-10);
case SC_SpinBoxFrame:
return opt->rect;
default:
break;
}
}
return QProxyStyle::subControlRect(cc,opt,sc,widget);
}
void spinbox_1::drawSpinBox(QStyle::SubControl sc, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const
{
QRect buttonRect = option->rect;
PrimitiveElement pe;
if(sc == SC_SpinBoxUp)
{
pe = PE_IndicatorSpinPlus;
buttonRect.translate(0,0);
}
else
{
pe = PE_IndicatorSpinMinus;
buttonRect.translate(option->rect.width()/2,0);
}
buttonRect.setWidth(option->rect.width()/2);
buttonRect.setHeight(option->rect.height()*0.4);
painter->save();
painter->setClipRect(buttonRect);
// painter->setPen(Qt::NoPen);
QLinearGradient gradient(0,0,0,option->rect.height());
gradient.setColorAt(0.0,QColor("#5ee7df"));
gradient.setColorAt(1.0,QColor("#b490ca"));
painter->setBrush(gradient);
QRect bgRect = buttonRect.adjusted(1,1,-1,-1);
int diameter = 12;
int cx = 100 * diameter / buttonRect.width();
int cy = 100 * diameter / buttonRect.height();
painter->drawRoundedRect(bgRect,cx,cy);
QPoint p = widget->mapFromGlobal(QCursor::pos());//鼠标点击位置转换
if(option->state &(State_On | State_Sunken)&&bgRect.contains(p))//鼠标按下位置
{
QColor pressColor(0,0,0,63);
painter->setBrush(pressColor);
painter->drawRoundedRect(bgRect,cx,cy);
}
painter->restore();
QStyleOption plusIcon(*option);
QRect subRect = subControlRect(CC_SpinBox,option,sc,widget);
plusIcon.rect = subRect.adjusted(subRect.width()*0.3,subRect.height()*0.3,-subRect.width()*0.3,-subRect.height()*0.3);
drawPrimitive(pe,&plusIcon,painter,widget);
// QProxyStyle::drawPrimitive(pe,&plusIcon,painter,widget);
}