前言
具体使用说明见:https://blog.csdn.net/qq_39641107/article/details/121250077?spm=1001.2014.3001.5501
示意图:
一、程序代码如下:
wbgaugeone.pri:
HEADERS += wbgaugeone.h
SOURCES += wbgaugeone.cpp
wbgaugeone.h:
#ifndef WBGAUGEONE_H
#define WBGAUGEONE_H
#include <QWidget>
#include <math.h>
#include <QPainter>
#include <QtCore>
#include <QFontMetrics>
class WBgaugeone : public QWidget
{
Q_OBJECT
public:
WBgaugeone(QWidget *parent = 0);
void setpointer_number(int pointer);//设置指针指向0-60
void setcolorarc(QColor rarc); //最外层圆弧颜色
void setcolorarc2(QColor rarc2); //中心圆渐变色起点颜色
void setcolornumber(QColor number); //数字颜色
void setcolorline(QColor line); //度量标直线颜色
void setcolorlips(QColor lips);//圆的终点颜色
void setcolorpointer(QColor pointer);//指针颜色
private:
QColor colorarc;//弧线颜色
QColor colorarc2;//弧线颜色2
QColor colornumber;//数字颜色
QColor colorline;//直线颜色
QColor colorelips;//圆颜色
QColor colorpointer;//指针颜色
QPen pen;//线
QBrush brush;//刷子
QRect rect;//视口
int x, y;
int pointer_number; //0-60
protected:
void paintEvent(QPaintEvent *);
void wbcircleEquation(int r, double j);
void wbdrawArc(QPainter *painter);//画弧线
void wbdrawNumber(QPainter *painter, QString numberstr,int x, int y);//画数字
void wbdrawLine(QPainter *painter, int linewidth,int x1, int y1, int x2, int y2);//画直线
void wbdrawEllips(QPainter *painter);//画圆
void wbdrawPointer(QPainter *painter, int x1,int y1, int x2,int y2, int x3, int y3);//画指针
};
#endif // WBGAUGEONE_H
wbgaugeone.cpp:
#include "wbgaugeone.h"
WBgaugeone::WBgaugeone(QWidget *parent) :
QWidget(parent)
{
colorarc = Qt::black;//弧线颜色
colorarc2 = Qt::white;//弧线颜色2
colornumber =Qt::red;//数字颜色
colorline = Qt::black;//直线颜色
colorelips = Qt::blue;//圆颜色
colorpointer = Qt::blue;//指针颜色
pointer_number = 0;
this->repaint();
}
void WBgaugeone::wbcircleEquation(int r ,double j)//根据x坐标获得圆的y坐标,sign判断y的正负性
{
double val = 3.14159265 / 180;
if (j>180)
{
x = -int(r*fabs(cos(val*j)));
y = int(r*fabs(sin(val*j)));
}
else if (j<=180 && j>90)
{
x = -int(r*fabs(cos(val*j)));
y = -int(r*fabs(sin(val*j)));
}
else if (j<=90 && j>0)
{
x = int(r*fabs(cos(val*j)));
y = -int(r*fabs(sin(val*j)));
}
else
{
x = int(r*fabs(cos(val*j)));
y = int(r*fabs(sin(val*j)));
}
}
void WBgaugeone::wbdrawArc(QPainter *painter)//画弧线
{
pen = QPen();
pen.setWidth(25);//25
pen.setColor(colorarc);
pen.setStyle(Qt::SolidLine);
pen.setCapStyle(Qt::RoundCap);
pen.setJoinStyle(Qt::BevelJoin);
painter->setPen(pen);
painter->save();
painter->translate(250,250);
rect.setRect(-235,-235,470,470);
painter->drawArc(rect,-45*16,270*16);
painter->restore();
}
void WBgaugeone::wbdrawNumber(QPainter *painter, QString numberstr,int x, int y)//画数字
{
QFont font;
font.setFamily("微软雅黑");//字体
// font.setPixelSize(25);//文字像素大小
font.setPointSize(25);//文字大小
// QFontMetrics textsize = QFontMetrics(font);
// QRect textrect = QRect(textsize.boundingRect(numberstr));
painter->setFont(font);
int widthofTitle = painter->fontMetrics().width(numberstr);//字符串显示的像素大小
int heightofTitle = painter->fontMetrics().height();
pen = QPen();
pen.setWidth(3);//3
pen.setColor(colornumber);
pen.setStyle(Qt::SolidLine);
pen.setCapStyle(Qt::FlatCap);
pen.setJoinStyle(Qt::BevelJoin);
painter->setPen(pen);
painter->save();
painter->translate(250,250);
painter->drawText(x-widthofTitle/2,y+heightofTitle/4,numberstr);
painter->restore();
}
void WBgaugeone::wbdrawLine(QPainter *painter, int linewidth,int x1, int y1,int x2, int y2)//画直线
{
pen = QPen();
pen.setWidth(linewidth);
pen.setColor(colorline);
pen.setStyle(Qt::SolidLine);
pen.setCapStyle(Qt::RoundCap);
pen.setJoinStyle(Qt::BevelJoin);
painter->setPen(pen);
painter->save();
painter->translate(250,250);
painter->drawLine(x1,y1,x2,y2);
painter->restore();
}
void WBgaugeone::wbdrawEllips(QPainter *painter)//画圆
{
pen = QPen();
pen.setWidth(2);//25
pen.setColor(colorelips);
pen.setStyle(Qt::SolidLine);
pen.setCapStyle(Qt::RoundCap);
pen.setJoinStyle(Qt::BevelJoin);
painter->setPen(pen);
// brush = QBrush();
// brush.setColor(colorelips);
// brush.setStyle(Qt::SolidPattern);
// painter->setBrush(brush);
rect.setRect(-25,-25,50,50);
QRadialGradient radial = QRadialGradient(0,0,25,0,0);
radial.setColorAt(0,colorarc2);
radial.setColorAt(1,colorelips);
painter->save();
painter->translate(250,250);
painter->setBrush(radial);
painter->drawEllipse(rect);
painter->restore();
}
void WBgaugeone::wbdrawPointer(QPainter *painter,int x1,int y1, int x2,int y2, int x3, int y3)//画指针
{
pen = QPen();
pen.setWidth(1);//25
pen.setColor(colorpointer);
pen.setStyle(Qt::SolidLine);
pen.setCapStyle(Qt::RoundCap);
pen.setJoinStyle(Qt::BevelJoin);
painter->setPen(pen);
brush = QBrush();
brush.setColor(colorpointer);
brush.setStyle(Qt::SolidPattern);
painter->setBrush(brush);
painter->save();
painter->translate(250,250);
painter->drawPolygon(QPolygon({QPoint(x1,y1),QPoint(x2,y2),QPoint(x3,y3)}));
painter->restore();
}
void WBgaugeone::paintEvent(QPaintEvent *)//绘制
{
QPainter wbpainter(this);
wbpainter.setRenderHint(QPainter::Antialiasing);
wbpainter.setRenderHint(QPainter::TextAntialiasing);
rect = QRect(0,0,this->width(),this->height());
wbpainter.setViewport(rect);
wbpainter.setWindow(0,0,500,500);
this->wbdrawArc(&wbpainter);
double j=225;
for (int i=0;i<=12;i++)
{
QString istr = QString::number(i,10);
this->wbcircleEquation(190,j);
this->wbdrawNumber(&wbpainter,istr,x,y);
for(int line_i = 0;line_i<=4;line_i++)
{
int x1,x2,y1,y2,r;
int linewidth;
if (line_i == 0)
{
linewidth = 5;
r=110;
}
else
{
linewidth = 2;
r=130;
}
this->wbcircleEquation(150,j-line_i*4.5);
x1=x;
y1=y;
this->wbcircleEquation(r,j-line_i*4.5);
x2=x;
y2=y;
this->wbdrawLine(&wbpainter,linewidth,x1,y1,x2,y2);
if (j == -45 && line_i == 0)
break;
}
j = j-22.5;
}
j=225;
int x1,x2,x3,y1,y2,y3;
this->wbcircleEquation(140,j-pointer_number*4.5);
x1=x;
y1=y;
this->wbcircleEquation(25,j-pointer_number*4.5-22.5);
x2=x;
y2=y;
this->wbcircleEquation(25,j-pointer_number*4.5+22.5);
x3=x;
y3=y;
this->wbdrawPointer(&wbpainter,x1,y1,x2,y2,x3,y3);
this->wbdrawEllips(&wbpainter);
}
//接口函数
void WBgaugeone::setpointer_number(int pointer)//设置指针指向0-60
{
if(pointer>=0&&pointer<=60)
{
pointer_number = pointer;
this->repaint();
}
}
void WBgaugeone::setcolorarc(QColor rarc) //最外层圆弧颜色
{
colorarc = rarc;
this->repaint();
}
void WBgaugeone::setcolorarc2(QColor rarc2) //中心圆渐变色起点颜色
{
colorarc2 = rarc2;
this->repaint();
}
void WBgaugeone::setcolornumber(QColor number) //数字颜色
{
colornumber = number;
this->repaint();
}
void WBgaugeone::setcolorline(QColor line) //度量标直线颜色
{
colorline = line;
this->repaint();
}
void WBgaugeone::setcolorlips(QColor lips)//圆的终点颜色
{
colorelips = lips;
this->repaint();
}
void WBgaugeone::setcolorpointer(QColor pointer)//指针颜色
{
colorpointer = pointer;
this->repaint();
}
总结
仪表盘
制作人:博咯
仅限他人学习,交流使用
void setpointer_number(int pointer);//设置指针指向0-60
void setcolorarc(QColor rarc); //最外层圆弧颜色
void setcolorarc2(QColor rarc2); //中心圆渐变色起点颜色
void setcolornumber(QColor number); //数字颜色
void setcolorline(QColor line); //度量标直线颜色
void setcolorlips(QColor lips);//圆的终点颜色
void setcolorpointer(QColor pointer);//指针颜色
该仪表盘主要通过QPainter进行绘制,可能有沉余代码,可以更加简洁,谢谢大家点赞及指导!