前言
基于QWidget实现的汽车仪表盘,包括发动机转速表,迈速表,油表,发动机水箱温度计,并且分别提供了接口。仪表盘的实现思路是计算各个表盘的坐标并进行绘制,尽可能减少贴图的使用。
效果图如下,代码自取,请放心食用。有不懂地方可留言交流,会不定期回复。
源码
这里提供基础的源码,包含了实现仪表盘的基本思路,其它素材可根据需求自行替换。
fr_armaturenbrett.h
#ifndef FRARMATURENBRETT_H
#define FRARMATURENBRETT_H
#include <QWidget>
class FrArmaturenbrett : public QWidget {
Q_OBJECT
public:
enum Gear {
kGear_1 = 1,
kGear_2,
kGear_3,
kGear_4,
kGear_5,
kGear_6,
kGear_7,
kGear_8,
kGear_D,
kGear_N,
kGear_P,
kGear_R
};
public:
explicit FrArmaturenbrett(QWidget *parent = nullptr);
public slots:
void set_gear(const Gear gear);
void set_rpm(const int rpm);
void set_speed(const int speed);
void set_temperature(const double temperature);
void set_oil(const int oil);
protected:
void paintEvent(QPaintEvent *event);
private:
void draw_tachometer(QPainter& painter); // 转速表
void draw_speedometer(QPainter& painter); // 迈速表
void draw_gear(QPainter& painter); // 挡位
void draw_thermometer(QPainter& painter); // 水箱温度计
void draw_oil_meter(QPainter& painter); // 油表
private:
Gear _gear;
int _rpm;
int _speed;
double _temperature;
int _oil;
};
#endif // FRARMATURENBRETT_H
fr_armaturenbrett.cpp
#include "fr_armaturenbrett.h"
#include <qapplication.h>
#include <qpainter.h>
#include <qpainterpath.h>
#include <QtGui/QFontDatabase>
FrArmaturenbrett::FrArmaturenbrett(QWidget *parent) :
QWidget(parent),
_gear(kGear_4),
_rpm(4000),
_speed(120),
_temperature(60),
_oil(80) {
QFontDatabase::addApplicationFont(":/fonts/DejaVuSans.ttf");
}
void FrArmaturenbrett::set_gear(const FrArmaturenbrett::Gear gear) {
_gear = gear;
update();
}
void FrArmaturenbrett::set_rpm(const int rpm) {
_rpm = rpm;
update();
}
void FrArmaturenbrett::set_speed(const int speed) {
_speed = speed;
update();
}
void FrArmaturenbrett::set_temperature(const double temperature) {
_temperature = temperature;
update();
}
void FrArmaturenbrett::set_oil(const int oil) {
_oil = oil;
update();
}
void FrArmaturenbrett::paintEvent(QPaintEvent* event) {
QWidget::paintEvent(event);
int side = qMin(int(width() / 1.8), height());
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.translate(width() / 2, height() / 2);
painter.scale(side / 200.0, side / 200.0);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::NoBrush);
draw_tachometer(painter);
draw_speedometer(painter);
draw_gear(painter);
draw_thermometer(painter);
draw_oil_meter(painter);
}
void FrArmaturenbrett::draw_tachometer(QPainter& painter) {
static QColor normal_color(26, 245, 245, 245);
static QColor overrun_color(245, 64, 64, 225);
// 绘制表盘外檐
painter.save();
painter.setPen(QPen(normal_color, 1, Qt::SolidLine));
QRect rect(-95, -95, 190, 190);
painter.drawArc(rect, 0, 270 * 16);
painter.restore();
// 绘制红色区域
painter.save();
static QRectF rectangle_outer(-95