#ifndef QSPEEDMETER_H
#define QSPEEDMETER_H
#include <QWidget>
#include <QPaintEvent>
#include <QPainter>
class QSpeedMeter : public QWidget
{
Q_OBJECT
public:
explicit QSpeedMeter(QWidget *parent = 0);
void setVal(int val);
void setFontSize(int val_f, int scale_f);
void setMeterAttribute(int val_max, int ticks);
protected:
void paintEvent(QPaintEvent *);
private:
int max;
int tick_num;
int cur_val;
int val_fsize;
int scale_fsize;
QString unit;
};
#endif // QSPEEDMETER_H
#include "qspeedmeter.h"
#include <QRadialGradient>
#include <QFont>
QSpeedMeter::QSpeedMeter(QWidget *parent) :
QWidget(parent)
{
max = 240;
tick_num = 8;
cur_val = 80;
val_fsize= 16;
scale_fsize = 12;
unit = "km/h";
}
void QSpeedMeter::setVal(int val)
{
cur_val = val;
this->update();
}
void QSpeedMeter::setFontSize(int val_f, int scale_f)
{
val_fsize = val_f;
scale_fsize = scale_f;
this->update();
}
void QSpeedMeter::setMeterAttribute(int val_max, int ticks)
{
max = val_max;
tick_num = ticks;
}
void QSpeedMeter::paintEvent(QPaintEvent *)
{
int width = this->width();
int height = this->height();
/* Initialize painter */
QPainter *painter = new QPainter(this);
painter->setRenderHint(QPainter::Antialiasing);
painter->translate( width/2, height/2 );
int radius = qMin(width, height)/2 - 2;
painter->setViewport(-radius, -radius, radius, radius);
painter->setWindow(-radius, -radius, radius, radius);
//------------------------------------------------------------
// 画外圈
QRadialGradient haloGradientw(0, 0, radius, 0, 0);
haloGradientw.setColorAt(0.0, Qt::lightGray);
haloGradientw.setColorAt(0.8, Qt::darkGray);
haloGradientw.setColorAt(0.9, Qt::white);
haloGradientw.setColorAt(1.0, Qt::black);
painter->setPen(Qt::NoPen);
painter->setBrush(haloGradientw);
painter->drawEllipse( QPoint(0, 0), radius, radius);
painter->setBrush(Qt::black);
painter->drawEllipse(QPoint(0, 0), radius*9/10, radius*9/10);
QFont font;
font.setPixelSize(scale_fsize);
painter->setFont(font);
//------------------------------------------------------------
// 画刻度
qreal angle = 270.0/(tick_num*2);
painter->setPen(Qt::green);
int step = max / tick_num;
for ( int i=0; i<=tick_num*2;i++ )
{
painter->save();
painter->rotate(225 + angle * i) ;
if(i & 0x1)
{
painter->drawLine(QPoint(0,-radius*7/10), QPoint(0,-radius*13/20));
}
else
{
painter->drawLine(QPoint(0,-radius*7/10), QPoint(0,-radius*6/10));
QString text = QString().sprintf("%d", i*step/2);
QSize size = painter->fontMetrics().size(Qt::TextSingleLine, text);
painter->drawText(QRectF(-size.width()/2, -radius*9/10 + 2,
size.width(), size.height()),
Qt::AlignCenter, text );
}
painter->restore();
}
angle = 270.0/max;
angle *= cur_val;
//------------------------------------------------------------
//画指针
const QPoint needle[5] = {
QPoint(0, -radius*13/20 ),
QPoint(2, 0),
QPoint(radius/20, radius/5),
QPoint(-radius/20, radius/5),
QPoint(-2, 0)
};
painter->setPen(Qt::NoPen);
painter->setBrush(QColor(100,255,100,120));
painter->save();
painter->rotate(225 + angle);
painter->drawPolygon(needle, 5);
painter->restore();
painter->setBrush(Qt::red);
painter->drawEllipse(QPoint(0,0), 5, 5);
//--------------------------------------------------------------------------------
//显示当前数据和单位
font.setPointSize(val_fsize);
painter->setFont(font);
painter->setPen(Qt::green);
QString text = QString().sprintf("%d", cur_val);
QSize size = painter->fontMetrics().size(Qt::TextSingleLine, text);
painter->drawText( QRectF(-size.width()/2, radius*2/7,
size.width(), size.height()),
Qt::AlignCenter, text );
size = painter->fontMetrics().size(Qt::TextSingleLine, unit);
painter->drawText(QRectF(-size.width()/2, -(radius*1/4+size.height()/2),
size.width(), size.height()),
Qt::AlignCenter, unit);
painter->end();
}