xref: /OK3568_Linux_fs/app/forlinx/flapp/src/plugins/allwinner/camera/CameraUI/src/myspeed.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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