1 #include "sliderwidget.h"
2 #include <QPainter>
3 #include <QMouseEvent>
4 #include <qmath.h>
5 #include <QDebug>
6 #include <QDebug>
7
8 class SliderWidgetPrivate
9 {
10 public:
11 int min =0;
12 int max=10;
13 int value=0;
14 qreal mousePress;
15 qreal margin=2.0;
16 qreal sliderWidth ;
17 qreal sliderHeight;
18 qreal sliderH;
19
20 qreal blockHeight;
21 qreal blockWidth;
22 qreal minHeight;
23 qreal maxHeight;
24
25 void handBlockShowRange();
26 void handValueRang();
27 void handleMousepress();
28 void handleValue();
29 };
30
31
SliderWidget(QWidget * parent)32 SliderWidget::SliderWidget(QWidget *parent) : QWidget(parent),
33 m_d(new SliderWidgetPrivate)
34 {
35 setMaximumWidth(30);
36 setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
37 }
38
~SliderWidget()39 SliderWidget::~SliderWidget()
40 {
41 delete m_d;
42 }
43
setRange(int min,int max)44 void SliderWidget::setRange(int min, int max)
45 {
46 m_d->max = max;
47 m_d->min = min;
48 }
49
value()50 int SliderWidget::value()
51 {
52 return m_d->value;
53 }
54
setValue(int value)55 void SliderWidget::setValue(int value)
56 {
57 m_d->value =value;
58 m_d->handleValue();
59 this->update();
60 }
61
mousePressEvent(QMouseEvent * e)62 void SliderWidget::mousePressEvent(QMouseEvent *e)
63 {
64 mouseMoveEvent(e);
65 }
66
mouseMoveEvent(QMouseEvent * e)67 void SliderWidget::mouseMoveEvent(QMouseEvent *e)
68 {
69 m_d->mousePress = e->pos().y();
70 m_d->handleMousepress();
71 emit valueChanged(m_d->value);
72 this->update();
73 }
74
paintEvent(QPaintEvent * e)75 void SliderWidget::paintEvent(QPaintEvent *e)
76 {
77 Q_UNUSED(e)
78 QPainter painter(this);
79 QRectF sliderRect(m_d->margin, m_d->margin, m_d->sliderWidth, m_d->sliderHeight);
80 painter.drawRect(sliderRect);
81 QRectF fillRect(m_d->margin, m_d->mousePress, m_d->sliderWidth, height()-m_d->mousePress);
82 painter.setBrush(Qt::blue);
83 painter.drawRect(fillRect);
84
85 QRectF blockRect(1, m_d->mousePress, m_d->blockWidth, m_d->blockHeight);
86 painter.setBrush(Qt::gray);
87 painter.drawRect(blockRect);
88
89 }
90
resizeEvent(QResizeEvent * e)91 void SliderWidget::resizeEvent(QResizeEvent *e)
92 {
93 QWidget::resizeEvent(e);
94 m_d->sliderWidth = width() - m_d->margin*2;
95 m_d->blockHeight = width()/2;
96 m_d->sliderHeight = height()-m_d->blockHeight;
97 m_d->blockWidth = width()-2;
98 m_d->sliderH = height() -m_d->margin-m_d->blockHeight;
99
100 // qDebug()<<"sliderHeight"<<m_d->sliderHeight;
101 // qDebug()<<"value "<<m_d->value;
102 // qDebug()<<"blockHeight "<<m_d->blockHeight;
103 // qDebug()<<"value "<<m_d->value;
104 // qDebug()<<"sliderH "<<m_d->sliderH;
105 // qDebug()<<"max-min "<<m_d->max -m_d->min;
106 m_d->handleValue();
107 // qDebug()<<"mouse : "<< m_d->mousePress;
108 }
109
sizeHint() const110 QSize SliderWidget::sizeHint() const
111 {
112 return QSize(25, 100);
113 }
114
handValueRang()115 void SliderWidgetPrivate::handValueRang()
116 {
117 if(value <= min)
118 {
119 value =min;
120 }else if(value >= max)
121 {
122 value = max;
123 }
124 }
125
handBlockShowRange()126 void SliderWidgetPrivate::handBlockShowRange()
127 {
128 //处理滑块最小位置.
129 if(mousePress> sliderHeight)
130 {
131 mousePress = sliderHeight;
132 }
133
134 //处理滑块最大位置.
135 if(mousePress <(margin))
136 {
137 mousePress =margin;
138 }
139 }
140
141
handleMousepress()142 void SliderWidgetPrivate::handleMousepress()
143 {
144 handBlockShowRange();
145 qreal dev = (max-min)/sliderH;
146 value = (sliderHeight-mousePress)*dev + min;
147 handValueRang();
148 }
149
handleValue()150 void SliderWidgetPrivate::handleValue()
151 {
152 qreal dev = (max-min)/sliderH ;
153 mousePress = sliderHeight - (value-min)/dev;
154 handBlockShowRange();
155 }
156