P6 QT项目----汽车仪表盘(6.4)
6.4.1 仪表表盘完成
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QtMath>
#include <QRadialGradient>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
timeStart(50);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
int rad = height()/2;
//设置画布
initCanvas(painter);
//画小圆
drawMiddleCircle(painter,60);
//画刻度
drawScale(painter,rad);
//画刻度文字
drawScaleText(painter,rad);
//画内圆的闪烁
drawInnerCircleShine(painter,140);
//画指标
drawIndex(painter);
//画扇形
drawPie(painter,rad+25);
//画内部黑色的圆
drawInnerCircleBlack(painter,70);
//画当前速度
drawCurrentSpeed(painter);
//画外圆闪烁
drawOutterCircleShine(painter,rad+25);
//画一个Logo
drawLogo(painter,rad);
}
void Widget::initCanvas(QPainter &painter)
{
//设置背景色
painter.setBrush(QBrush(Qt::black));
painter.drawRect(rect());
//抗锯齿
painter.setRenderHint(QPainter::Antialiasing,true);
//设置中心为坐标原点,平移坐标
QPoint rec_center(rect().width()/2,rect().height()*0.6);
painter.translate(rec_center);
}
void Widget::drawMiddleCircle(QPainter &painter, int radius)
{
//画小圆
painter.setPen(QPen(Qt::white,3));
painter.drawEllipse(QPoint(0,0),radius,radius);
}
void Widget::drawCurrentSpeed(QPainter &painter)
{
//当前速度值
QFont font_figure("Arial",20);
font_figure.setBold(true);
painter.setFont(font_figure);
painter.setPen(QPen(Qt::white,20));
painter.drawText(QRect(-60,-60,120,80),Qt::AlignCenter,QString::number(currentdata*4));
//显示Km/h
QFont font_text("Arial",10);
font_text.setBold(true);
painter.setFont(font_text);
painter.setPen(QPen(Qt::white,10));
painter.drawText(QRect(-60,-60,120,170),Qt::AlignCenter,"Km/h");
}
void Widget::drawScale(QPainter &painter, int radius)
{
//画刻度
painter.save(); //保存当前坐标位置,x在3点钟方向
painter.rotate(initial_angle); //表盘起始位置
painter.setPen(QPen(Qt::white,5));
//算出一个刻度所需要的角度
rotation_angle = 240 * 1.0/ 60; //240*1.0的作用是扩大变量类型,把int型阔成double,保留小数
for (int i = 0; i <= 60; i++) {
//大于160的刻度线标红
if(i >= 40){
painter.setPen(QPen(Qt::red,5));
}
if(i % 5 == 0){
//画长刻度线
painter.drawLine(radius-23,0,height()/2-2,0);
}
else {
//画短刻度线
painter.drawLine(radius-8,0,height()/2-2,0);
}
//画完后旋转,改变坐标轴方向
painter.rotate(rotation_angle);
}
painter.restore(); //恢复坐标位置,x在3点钟方向
painter.setPen(QPen(Qt::white,5));
}
void Widget::drawScaleText(QPainter &painter, int radius)
{
//写刻度文字
QFont font("Arial",10);
font.setBold(true);
painter.setFont(font);
int r = radius-50;
for (int i = 0; i <= 60; i++) {
if(i % 5 == 0){
//保存坐标系
painter.save();
//算出平移点
int deltX = qCos(qDegreesToRadians(210 - rotation_angle*i)) * r; //QT的正弦,余弦函数认的是弧度
int deltY = qSin(qDegreesToRadians(210 - rotation_angle*i)) * r;
//平移坐标系
painter.translate(QPoint(deltX,-deltY));
//旋转坐标系
painter.rotate(-120 + rotation_angle*i);
//写刻度数字
painter.drawText(QRect(-25,-25,50,30),Qt::AlignCenter,QString::number(i*4));
//恢复坐标系
painter.restore();
}
}
}
void Widget::drawIndex(QPainter &painter)
{
//画指标
painter.save();
static const QPointF points[4] = {
QPointF(0, -10.0),
QPointF(220.0, -1),
QPointF(220.0, 1),
QPointF(0,0)
};
painter.setPen(Qt::NoPen);
painter.setBrush(QBrush(Qt::white));
painter.rotate(initial_angle + currentdata*rotation_angle);
painter.drawPolygon(points, 4);
}
void Widget::drawPie(QPainter &painter, int radius)
{
//画扇形
//坐标轴回到原来位置(0,0)
painter.restore();
//去边框
painter.setPen(Qt::NoPen);
//背景色
painter.setBrush(QColor(222,164,121,100));
//确认矩形,扇形长度与指标相同
QRect rectangle(-radius,-radius,radius*2,radius*2);
painter.drawPie(rectangle,-(initial_angle*16),-(rotation_angle*currentdata*16));
}
void Widget::timeStart(int ms)
{
timer = new QTimer(this);
connect(timer,&QTimer::timeout,[=](){
if(flag == 0){
currentdata++;
if(currentdata >= 60){
flag = 1;
}
}
else {
currentdata--;
if(currentdata == 0){
flag = 0;
}
}
update();
});
timer->start(ms);
}
void Widget::drawInnerCircleShine(QPainter &painter, int radius)
{
//内圆渐变色彩,径向渐变
painter.setPen(Qt::NoPen);
QRadialGradient radialGradient(QPoint(0,0),radius);
radialGradient.setColorAt(0,QColor(255,0,0,200));
radialGradient.setColorAt(1,QColor(0,0,0,100));
painter.setBrush(QBrush(radialGradient));
painter.drawEllipse(QPoint(0,0),radius,radius);
}
void Widget::drawInnerCircleBlack(QPainter &painter, int radius)
{
//画出黑色的圆
painter.setPen(Qt::NoPen);
painter.setBrush(QBrush(Qt::black));
painter.drawEllipse(QPoint(0,0),radius,radius);
}
void Widget::drawOutterCircleShine(QPainter &painter, int radius)
{
//外圆渐变色彩,径向渐变
painter.setPen(Qt::NoPen);
QRadialGradient radialGradient(QPoint(0,0),radius);
radialGradient.setColorAt(0,QColor(0,0,0,0));
radialGradient.setColorAt(0.8,QColor(255,0,0,0));
radialGradient.setColorAt(0.9,QColor(255,0,0,50));
radialGradient.setColorAt(1,QColor(255,0,0,150));
painter.setBrush(QBrush(radialGradient));
QRect rectangle(-radius,-radius,radius*2,radius*2);
painter.drawPie(rectangle,-(initial_angle*16),-(rotation_angle*60*16));
}
void Widget::drawLogo(QPainter &painter, int radius)
{
QRect rectangle(-150,radius*0.5,300,100);
painter.drawPixmap(rectangle,QPixmap(":/icon.jpg"));
}