仪表盘
1.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPainter>
#include <QtMath>
#include <QKeyEvent>
#include <QTimer>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void paintEvent(QPaintEvent *event);
void DrawSmallScale(QPainter&,int);
void DrawCircle_line(QPainter& ,int );
void Draw_jian_bian_Circle(QPainter &, int);
void Draw_jian_bian_Circle1(QPainter &, int);
void DrawCircle1(QPainter & ,int );
void DrawDigital(QPainter & ,int );
void DrawUnit(QPainter &, int );
void DrawPointer(QPainter &, int);
void DrawNum(QPainter &,int h);
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
private slots:
void slot_speed_changed();
private:
Ui::MainWindow *ui;
int direction;
QTimer * myTimer;
int degRotate;
};
#endif // MAINWINDOW_H
#define M_PI 3.14159265358979323846
2.
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#pragma execution_character_set("utf-8")
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setFixedSize(1280,800);
this->setStyleSheet("#MainWindow{background-image:url(:/res/pic/background.png)}");
myTimer=new QTimer(this);
myTimer->start(50);
direction=1;
degRotate=0;
connect(myTimer,&QTimer::timeout,this,&MainWindow::slot_speed_changed);
//1.画刻度:0-20-40---240 0-20中间5个空格
//0-40:10个空格
//0-20*x:5*x个空格
//0-240:60个空格
//2.画0,20,40,60---240
//3.在刻度外面画渐变发光圆弧
//4.画指针
//5.画最外层的一条极细的蓝色圆弧
//6.画中间的黑色大圆10, 20, 30
//7.在黑色大圆里画渐变发光的蓝色小圆
//8.在蓝色小圆里再画黑色小圆(10, 20, 30),只留下一部分蓝色渐变
//9.画单位km/h和文字(1)当前车速,(2)请按space键加速
//10.画中心圆内的时速
//要画这些东西,需要(1)颜色,(2)位置
}
MainWindow::~MainWindow()
{
delete myTimer;
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
//先确定圆心
int x_center=width()/2;
int y_center=height()/2;
//偏移坐标系统
painter.translate(x_center,y_center);
int radius=350;
DrawCircle_line(painter,radius);
Draw_jian_bian_Circle(painter,radius-5);//390-5=385
DrawSmallScale(painter,radius-5-30);//385-355=30
DrawDigital(painter,radius-5-30-27);//355-27
DrawPointer(painter,radius-5-30-27-40);
DrawCircle1(painter,150);
Draw_jian_bian_Circle1(painter,130);
DrawUnit(painter,40);
DrawNum(painter,100);
}
void MainWindow::DrawSmallScale(QPainter &painter, int radius)
{
QPainterPath pointPath_small;
pointPath_small.moveTo(-2,-2);
pointPath_small.lineTo(2,-2);
pointPath_small.lineTo(2,8);
pointPath_small.lineTo(-2,8);
QPainterPath pointPath_big;
pointPath_big.moveTo(-2,-2);
pointPath_big.lineTo(2,-2);
pointPath_big.lineTo(2,20);
pointPath_big.lineTo(-2,20);
int i=-30;
int a=0;
int speed;
while(i<=210)
{
//最左边对应i==-30,最右边对应i==210
speed=i+30;
QPointF point(0,-radius);
painter.save();
//qDebug()<<point;
painter.rotate(-90+i);
painter.translate(point.x(),point.y());
if(speed<160)painter.setBrush(QColor(255,255,255));
else painter.setBrush(QColor(235, 70, 70));
if(a%5==0)painter.drawPath(pointPath_big);
else painter.drawPath(pointPath_small);
i+=4;
//rotate:0---90°
//rotate:-30---60°
//rotate:30---120°
a++;
painter.restore();
}
}
void MainWindow::DrawCircle_line(QPainter &painter, int r2)
{
//最外细圆线
painter.save();
QPainterPath outRing;
outRing.moveTo(0,0);
outRing.arcTo(-r2,-r2,2*r2,2*r2,-30,240);
outRing.closeSubpath();
QPainterPath inRing;
inRing.moveTo(0,0);
int r3=r2-5;
inRing.addEllipse(-r3,-r3,2*r3,2*r3);
painter.setBrush(QColor(6, 217, 244));
painter.drawPath(outRing.subtracted(inRing));
painter.restore();
}
void MainWindow::Draw_jian_bian_Circle(QPainter &painter, int r2)
{
//渐变圆环
painter.save();
QPainterPath outRing;
outRing.moveTo(0,0);
outRing.arcTo(-r2,-r2,2*r2,2*r2,-30,240);//从-30度出发,共240度
outRing.closeSubpath();
QPainterPath inRing;
inRing.moveTo(0,0);
int r3=r2-25;//
inRing.addEllipse(-r3,-r3,2*r3,2*r3);
QRadialGradient radialGradient(0,0,r2,0,0);
radialGradient.setColorAt(1,QColor(0,82,199));
radialGradient.setColorAt(0.92,Qt::transparent);
painter.setBrush(radialGradient);
painter.drawPath(outRing.subtracted(inRing));
painter.restore();
}
void MainWindow::Draw_jian_bian_Circle1(QPainter &painter, int r2)
{
//渐变圆环
painter.save();
QPainterPath outRing;
outRing.moveTo(0,0);
outRing.arcTo(-r2,-r2,2*r2,2*r2,0,360);
outRing.closeSubpath();
QPainterPath inRing;
inRing.moveTo(0,0);
int r3=r2-30;//
inRing.addEllipse(-r3,-r3,2*r3,2*r3);
QRadialGradient radialGradient(0,0,r2,0,0);
radialGradient.setColorAt(1,QColor(10,68,185,150));
radialGradient.setColorAt(0.8,Qt::transparent);
painter.setBrush(radialGradient);
painter.drawPath(outRing.subtracted(inRing));
painter.restore();
}
void MainWindow::DrawCircle1(QPainter &painter, int r1)
{
QRect rect(-r1,-r1,2*r1,2*r1);
painter.setBrush(QBrush(QColor(10, 20, 30)));
painter.drawEllipse(rect);
}
void MainWindow::DrawDigital(QPainter &painter, int r)
{
painter.save();
painter.setPen(QColor(255,255,255));
QFont font;
font.setFamily("Arial");
font.setPointSize(15);
font.setBold(true);
painter.setFont(font);
//0,20,40,,,240
//20*0,20*1,20*2,,,20*12
//0-12,13个数
for(int i=0;i<13;i++)
{
QPointF point(0,-r);
painter.save();
//0:210,20:190,120:90
int angle=210-i*20;
//angle:90:不用旋转(0),70:-20
painter.rotate(angle-90);
painter.translate(point);
//240度
//120---不用旋转
painter.drawText(-25,0,50,30,Qt::AlignCenter,QString::number(240-i*20));
painter.restore();
}
painter.restore();
}
void MainWindow::DrawUnit(QPainter &painter, int h)
{
painter.save();
painter.setPen(QColor(255,255,255));
QFont font;
font.setFamily("Arial");
font.setPointSize(16);
font.setBold(true);
painter.setFont(font);
painter.drawText(-50,h,100,20,Qt::AlignCenter,QString("km/h"));
painter.drawText(-70,h+150,140,40,Qt::AlignCenter,QString("当前车速"));
painter.setPen(QColor(255,255,255,80));
painter.drawText(-125,h+280,250,40,Qt::AlignCenter,QString("-请按space键加速-"));
painter.restore();
}
void MainWindow::DrawPointer(QPainter &painter, int radius)
{
QPainterPath pointPath;
pointPath.moveTo(10,0);
pointPath.lineTo(1,-radius);
pointPath.lineTo(-1,-radius);
pointPath.lineTo(-10,0);
pointPath.arcTo(-10,-10,20,20,180,180);
QPainterPath inRing;
inRing.addEllipse(-5,-8,10,10);
painter.save();
//计算并选择绘图对象坐标
painter.rotate(degRotate-120);
painter.setBrush(QColor(255,255,255));
painter.drawPath(pointPath);
painter.drawPath(pointPath.subtracted(inRing));
painter.restore();
}
void MainWindow::DrawNum(QPainter &painter,int h)
{
painter.save();
painter.setPen(QColor(255,255,255));
QFont font;
font.setFamily("Arial");
font.setPointSize(45);
painter.setFont(font);
painter.drawText(-75,-h*2/3,150,h,Qt::AlignCenter,QString::number(degRotate));
painter.restore();
}
void MainWindow::keyPressEvent(QKeyEvent *event)
{
//按下就加速,释放就减速
//direction=0,加速
//direction=1,减速
if(event->key()==Qt::Key_Space){
direction=0;
}
}
void MainWindow::keyReleaseEvent(QKeyEvent *event)
{
if(event->key()==Qt::Key_Space){
direction=1;
}
}
void MainWindow::slot_speed_changed()
{
if(direction){
//减速
if(degRotate>0)degRotate--;
}
else{
if(degRotate<240)degRotate++;
}
qDebug()<<degRotate;
update();
}
3.效果

4.背景图片

天道酬勤 循序渐进 技压群雄
浙公网安备 33010602011771号