1 #include "myspeed.h"
2 #include <QPainter>
3 #include <QtMath>
mySpeed(QWidget * parent)4 mySpeed::mySpeed(QWidget *parent)
5 : QMainWindow(parent)
6 {
7 m_background = Qt::black;
8 m_foreground = Qt::green;
9
10 m_startAngle=60;
11 m_endAngle=60;
12 m_scaleMajor=10;
13 m_minValue=0;
14 m_maxValue=100;
15 m_scaleMajor = 10;//分度
16 m_scaleMinor = 10;
17 m_units = "km/h";
18 m_title = "Speed Meter";
19 m_precision = 0;
20 m_value=0;
21
22 m_updateTimer = new QTimer(this);
23 m_updateTimer->setInterval(100);
24 connect(m_updateTimer,SIGNAL(timeout()),this,SLOT(UpdateAngle()));
25 m_updateTimer->start();
26
27 setWindowFlags(Qt::FramelessWindowHint);
28 setAttribute(Qt::WA_TranslucentBackground);
29 resize(150,150);
30 }
31
~mySpeed()32 mySpeed::~mySpeed()
33 {
34
35 }
drawCrown(QPainter * painter)36 void mySpeed::drawCrown(QPainter *painter)
37 {
38 painter->save();
39 int radius =50;
40 QLinearGradient lg1(0,-radius,0,radius);
41 lg1.setColorAt(0.2,Qt::white);
42 lg1.setColorAt(1,Qt::black);
43 painter->setBrush(lg1);
44 painter->drawEllipse(-50, -50 , 100 ,100);
45 painter->restore();
46 }
drawBackground(QPainter * painter)47 void mySpeed::drawBackground(QPainter *painter)
48 {
49 painter->save();
50 painter->setBrush(m_background);
51 painter->drawEllipse(-90, -90, 180 ,180);
52 painter->restore();
53 }
drawScaleNum(QPainter * painter)54 void mySpeed::drawScaleNum(QPainter *painter)
55 {
56 painter->save();
57 painter->setPen(m_foreground);
58 double startRad = (360 - m_startAngle - 90) * (3.14 / 180);
59 double deltaRad = (360 - m_startAngle - m_endAngle) * (3.14 / 180) / m_scaleMajor;
60 double sina,cosa;
61 int x, y;
62 QFontMetricsF fm(this->font());
63 double w, h, tmpVal;
64 QString str;
65
66 for (int i = 0; i <= m_scaleMajor; i++)
67 {
68 sina = sin(startRad - i * deltaRad);
69 cosa = cos(startRad - i * deltaRad);
70
71 tmpVal = 1.0 * i *((m_maxValue - m_minValue) / m_scaleMajor) + m_minValue;
72
73 str = QString( "%1" ).arg(tmpVal);
74 w = fm.size(Qt::TextSingleLine,str).width();
75 h = fm.size(Qt::TextSingleLine,str).height();
76 x = 82 * cosa - w / 2;
77 y = -82 * sina + h / 4;
78 painter->drawText(x, y, str);
79 }
80 painter->restore();
81 }
82
drawScale(QPainter * painter)83 void mySpeed::drawScale(QPainter *painter)
84 {
85 painter->save();
86 painter->rotate(m_startAngle);
87 int steps = (m_scaleMajor * m_scaleMinor);
88 double angleStep = (360.0 - m_startAngle - m_endAngle) / steps;
89 painter->setPen(m_foreground); //
90 QPen pen = painter->pen();
91 for (int i = 0; i <= steps; i++)
92 {
93 if (i % m_scaleMinor == 0)
94 {
95 pen.setWidth(1);
96 painter->setPen(pen);
97 painter->drawLine(0, 62, 0, 72);
98 }
99 else
100 {
101 pen.setWidth(0);
102 painter->setPen(pen);
103 painter->drawLine(0, 67, 0, 72);
104 }
105 painter->rotate(angleStep);
106 }
107 painter->restore();
108 }
109
110
drawTitle(QPainter * painter)111 void mySpeed::drawTitle(QPainter *painter)
112 {
113 painter->save();
114 painter->setPen(m_foreground);
115 //painter->setBrush(m_foreground);
116 QString str(m_title);
117 QFontMetricsF fm(this->font());
118 double w = fm.size(Qt::TextSingleLine,str).width();
119 painter->drawText(-w / 2, -30, str);
120 painter->restore();
121 }
drawNumericValue(QPainter * painter)122 void mySpeed::drawNumericValue(QPainter *painter)
123 {
124 QString str = QString("%1 %2").arg(m_value, 0, 'f', m_precision).arg(m_units);
125 QFontMetricsF fm(font());
126 double w = fm.size(Qt::TextSingleLine,str).width();
127 painter->setPen(m_foreground);
128 painter->drawText(-w / 2, 42, str);
129 }
130
drawIndicator(QPainter * painter)131 void mySpeed::drawIndicator(QPainter *painter)
132 {
133 painter->save();
134 QPolygon pts;
135 pts.setPoints(3, -2,0, 2,0, 0,60);
136
137 painter->rotate(m_startAngle);
138 double degRotate = (360.0 - m_startAngle - m_endAngle)/(m_maxValue - m_minValue)*(m_value - m_minValue);
139
140
141 painter->rotate(degRotate);
142 QRadialGradient haloGradient(0, 0, 60, 0, 0);
143 haloGradient.setColorAt(0, QColor(60,60,60));
144 haloGradient.setColorAt(1, QColor(160,160,160));
145 painter->setPen(Qt::white);
146 painter->setBrush(haloGradient);
147 painter->drawConvexPolygon(pts);
148 painter->restore();
149
150
151 QColor niceBlue(150, 150, 200);
152 QConicalGradient coneGradient(0, 0, -90.0);
153 coneGradient.setColorAt(0.0, Qt::darkGray);
154 coneGradient.setColorAt(0.2, niceBlue);
155 coneGradient.setColorAt(0.5, Qt::white);
156 coneGradient.setColorAt(1.0, Qt::darkGray);
157 painter->setPen(Qt::NoPen);
158 painter->setBrush(coneGradient);
159 painter->drawEllipse(-5, -5, 10, 10);
160 }
161
162
paintEvent(QPaintEvent *)163 void mySpeed::paintEvent(QPaintEvent *)
164 {
165 QPainter painter (this);
166 painter.setRenderHint(QPainter::Antialiasing);
167 painter.translate(width()/2,height()/2);
168 int side = qMin(width(),height());
169 painter.scale(side /200.0,side /200.0);
170 drawCrown(&painter);
171 drawBackground(&painter);
172 drawScaleNum(&painter);
173
174 drawScale(&painter);
175 drawTitle(&painter);
176
177 drawNumericValue(&painter);
178 drawIndicator(&painter);
179
180 }
181
UpdateAngle()182 void mySpeed::UpdateAngle()
183 {
184 m_value += 1;
185 if(m_value > 100)
186 {
187 m_value = 0;
188 }
189
190
191 update();
192 }
193
194