效果如下:
思路如下:
1、先画两个圆,构成外围的圆环。
2、画指示箭头。
3、画刻度和刻度上数字
4、添加一个横向滑块用于动态显示。
5、添加两个标签用于速度显示。
直接上代码:
头文件:
#ifndef PAINT_H
#define PAINT_H
#include <QMainWindow>
#include <QPaintEvent>
#include <QPainter>
#include <QPen>
#include <QLinearGradient>
#include <QSlider>
#include <QDebug>
#include <QString>
namespace Ui {
class Paint;
}
class Paint : public QMainWindow
{
Q_OBJECT
public:
explicit Paint(QWidget *parent = 0);
~Paint();
protected:
void drawCrown(QPainter *painter);//外环
void drawArrow(QPainter *painter);//箭头
void drawCalibration(QPainter *painter);//刻度
void drawNumber(QPainter *painter);//刻度数字
void drawSpeed(QPainter *p);//速度显示
void paintEvent(QPaintEvent *event);
private slots:
public:
void memberInt();
private:
unsigned int centerX;//圆心横坐标
unsigned int centerY;//圆心纵坐标
unsigned int outRadius;//外环半径
unsigned int inRadius;//内环半径
unsigned int value;//滑块当前值
private:
Ui::Paint *ui;
};
#endif // PAINT_H
源文件:
#include "paint.h"
#include "ui_paint.h"
Paint::Paint(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Paint)
{
ui->setupUi(this);
memberInt();
ui->horizontalSlider->setMinimum(0);
ui->horizontalSlider->setMaximum(360);
}
Paint::~Paint()
{
delete ui;
}
void Paint::drawCrown(QPainter *painter)
{
painter->save();
QLinearGradient H(350,400,650,400);
H.setColorAt(0,Qt::black);
H.setColorAt(1,Qt::blue);
painter->setBrush(H);
painter->setPen(Qt::NoPen);
painter->drawEllipse(QPoint(centerX,centerY),outRadius,outRadius);
painter->setBrush(Qt::lightGray);
painter->drawEllipse(QPoint(centerX,centerY),inRadius,inRadius);
painter->restore();
}
void Paint::drawArrow(QPainter *painter)
{
painter->save();
QPen pen;
pen.setColor(Qt::red);
pen.setWidth(6);
pen.setStyle(Qt::SolidLine);
painter->setPen(pen);
painter->translate(centerX,centerY);
value = ui->horizontalSlider->value();
painter->rotate(value);
painter->drawLine(0,0,-300,0);
painter->drawLine(-300,0,-260,-20);
painter->drawLine(-300,0,-260,20);
this->update();
painter->restore();
}
void Paint::drawCalibration(QPainter *painter)
{
QPen pen;
pen.setColor(Qt::black);
pen.setWidth(5);
pen.setStyle(Qt::SolidLine);
painter->setPen(pen);
painter->translate(centerX,centerY);
for(int i = 0; i<360;i+=10)
{
painter->save();
painter->rotate(i);
painter->drawLine(-inRadius,0,-inRadius+10,0);
painter->restore();
}
}
void Paint::drawNumber(QPainter *painter)
{
for(int i = 0; i<360;i+=10)
{
QString str;
painter->save();
painter->rotate(i);
painter->drawText(-inRadius+10,0,str.setNum(i));
painter->restore();
}
}
void Paint::drawSpeed(QPainter *p)
{
QString str;
ui->label->setGeometry(400,500,160,80);
ui->label_2->setGeometry(500,500,160,80);
int speed = ui->horizontalSlider->value();
ui->label->setText(str.setNum(speed));
ui->label_2->setText("Km/h");
}
void Paint::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
drawCrown(&painter);
drawArrow(&painter);
drawCalibration(&painter);
drawNumber(&painter);
drawSpeed(&painter);
}
void Paint::memberInt()
{
centerX = 500;
centerY = 400;
outRadius = 360;
inRadius = 340;
value = 0;
}
刚学QT画的简易仪表盘,好多地方没有深究、没有细化。大佬莫细追。
好记性不如烂笔头,每天进步一点点。