1 #include "rollswitchwidget.h"
2 #include <QMouseEvent>
3 #include <QPainter>
4 #include<QPen>
5 #include <QDebug>
6 #include <qmath.h>
7
RollSwitchWidget(QWidget * parent)8 RollSwitchWidget::RollSwitchWidget(QWidget *parent)
9 : QWidget(parent),
10 m_text("SERIAL %1"),
11 m_index(0),
12 m_count(3)
13 {
14
15 }
16
setCount(int count)17 void RollSwitchWidget::setCount(int count)
18 {
19 m_count = count;
20 }
21
currentIndex()22 int RollSwitchWidget::currentIndex()
23 {
24 return m_index;
25 }
26
getPoint(int r,int angle)27 QPoint getPoint(int r, int angle)
28 {
29 int x1 = r * qCos(angle * M_PI / 180);
30 int y1 = r * qSin(angle * M_PI /180);
31
32 return QPoint(x1, y1);
33 }
34
paintEvent(QPaintEvent * e)35 void RollSwitchWidget::paintEvent(QPaintEvent *e)
36 {
37 QWidget::paintEvent(e);
38 QPainter painter(this);
39 painter.setRenderHints(QPainter::Antialiasing);
40 QMargins margins = contentsMargins();
41
42 QFont f = this->font();
43 f.setPointSizeF(f.pointSizeF()+1);
44 f.setBold(true);
45 painter.setFont(f);
46
47 QRect rect = this->rect().adjusted(margins.left(), margins.top(), - margins.bottom(), -margins.right());
48
49 int textX = rect.width()/3;
50 int textY = rect.y();
51 QString text = QString(m_text).arg(m_index+1);
52
53 QRectF textRect(textX, textY, textX, rect.height());
54 QTextOption option(Qt::AlignCenter);
55 QRectF fixRect = painter.boundingRect(textRect, text, option);
56 painter.save();
57 //painter.setPen(QColor(141, 141, 141));
58 painter.setPen(QColor(56, 56, 56));
59 painter.drawText(fixRect, text);
60 painter.restore();
61
62 m_leftRect= QRect(rect.x(), rect.y(), textX, rect.height());
63 m_rightRect = QRect(rect.x() +textX*2, rect.y(), textX, rect.height());
64
65 int r = m_leftRect.height()/2;
66 QPointF center(m_leftRect.x()+ m_leftRect.width()/2,
67 m_leftRect.y() +m_leftRect.height()/2);
68
69
70 QPen pen(Qt::gray);
71 pen.setWidthF(2.5);
72
73 painter.save();
74
75 QPalette palette = this->palette();
76 palette.setCurrentColorGroup(QPalette::Disabled);
77 // if(currentIndex() == 0)
78 // {
79 // pen.setColor(palette.color(QPalette::Text));
80 // }
81 painter.setPen(pen);
82 painter.translate(center);
83 painter.drawLine(QPointF(0,0), getPoint(m_leftRect, 30));
84 painter.drawLine(QPointF(0,0), getPoint(m_leftRect, -30));
85 painter.restore();
86
87 center = QPointF(m_rightRect.x() + m_rightRect.width()/2,
88 m_rightRect.y() + m_rightRect.height()/2);
89 painter.save();
90 pen.setColor(Qt::gray);
91 // if(currentIndex() == m_count-1)
92 // {
93 // pen.setColor(palette.color(QPalette::Text));
94 // }
95 painter.setPen(pen);
96 painter.translate(center);
97 painter.drawLine(QPointF(0,0), getPoint(m_rightRect, 150));
98 painter.drawLine(QPointF(0,0), getPoint(m_rightRect, -150));
99 painter.restore();
100
101 }
102
mousePressEvent(QMouseEvent * e)103 void RollSwitchWidget::mousePressEvent(QMouseEvent *e)
104 {
105 if(m_leftRect.contains(e->pos()))
106 {
107 m_index --;
108 }else if(m_rightRect.contains(e->pos()))
109 {
110 m_index ++;
111 }
112
113 if(m_index <0)
114 {
115 m_index =2;
116 }if(m_index >= m_count)
117 {
118 m_index =0;
119 }
120 this->update();
121 emit indexChange(m_index);
122
123 }
124
getPoint(const QRect & rect,int angle)125 QPointF RollSwitchWidget::getPoint(const QRect &rect, int angle)
126 {
127 int r = rect.width()/2;
128 if(rect.width() >rect.height())
129 {
130 r = rect.height()/2;
131 }
132
133 int x1 = r * qCos(angle * M_PI / 180);
134 int y1 = r * qSin(angle * M_PI /180);
135
136 return QPointF(x1, y1);
137
138 }
139