代码一步一步讲,就不写用啥之类的了,暗部走来,自己找使用的类以及使用方法
1、创建工程

2、重载paintEvent
#include <QMainWindow>
#include <QPainter>
#include <QPaintEvent>
protected:
virtual void paintEvent(QPaintEvent *event);
void MainWindow::paintEvent(QPaintEvent *event)
{
}
3、构建绘画对象,调整表盘位置、画笔位置、刷子之类的
//创建对象
QPainter m_painter(this);
//表盘宽度不变,高度-100,中心位置在前面两个小的的中间
int m_width = this->width();
int m_height = this->height() - 100;
int radius = ((m_width > m_height)?m_height:m_width)/2.0;
//移动画笔到中下方位置
m_painter.translate(m_width/2,m_height*0.6);
//启用反锯齿
m_painter.setRenderHint(QPainter::Antialiasing, true);
m_painter.setPen(Qt::NoPen);
//设置画刷颜色
m_painter.setBrush(QColor(138,43,226));
4、画刻度线
//刻度线
DrawSmallScale(m_painter, radius - 60);
private:
void DrawSmallScale(QPainter & painter, int radius);
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);
//绘制61个小点
for(int i = 0; i < 121; i += 2)
{
QPointF point(0, 0);
painter.save();
point.setX(radius* qCos(((210-i*2)*M_PI)/180));
point.setY(radius* qSin(((-210+i*2)*M_PI)/180));
painter.translate(point.x(), point.y());
painter.rotate(-120+i*2);
if(i<80)
{
painter.setBrush(QColor(0, 0, 0));
}
if(i>=80)
{
painter.setBrush(QColor(235, 70, 70));
}
if(i%5 == 0)
{
painter.drawPath(pointPath_big);//绘画大刻度
}
else
{
painter.drawPath(pointPath_small);//绘画小刻度
}
painter.restore();
}
}

5、刻度数字
//刻度数字
DrawDigital(m_painter, radius - 90);
void DrawDigital(QPainter & painter, int radius);
void MainWindow::DrawDigital(QPainter &painter, int radius)
{
//设置画笔,画笔默认NOPEN
painter.setPen(QColor(0, 0, 0));
QFont font;
font.setFamily("Arical");
font.setPointSize(15);
font.setBold(true);
painter.setFont(font);
for(int i=0;i<13;++i)
{
QPointF point(0, 0);
painter.save();
point.setX(radius* qCos(((210-i*20)*M_PI)/180));
point.setY(radius* qSin(((210-i*20)*M_PI)/180));
painter.translate(point.x(), -point.y());
painter.rotate(-120+i*20);
painter.drawText(-25, 0, 50, 20, Qt::AlignCenter, QString::number(i*20));
painter.restore();
}
//还原画笔
painter.setPen(Qt::NoPen);
}

6、逐渐发光外扇形
/*所有形状绘画*/
//逐渐发光外扇形
DrawCircle(m_painter, radius - 35);
void DrawCircle(QPainter & painter, int radius);
void MainWindow::DrawCircle(QPainter &painter, int radius)
{
//保存绘图对象
painter.save();
//计算大小圆路径
QPainterPath outRing;
QPainterPath inRing;
outRing.moveTo(0,0);
inRing.moveTo(0,0);
outRing.arcTo(-radius, -radius, 2*radius, 2*radius, -30, 240);
inRing.addEllipse(-radius+50, -radius+50, 2*(radius-50), 2*(radius-50));
outRing.closeSubpath();
//设置渐变色
QRadialGradient radialGradient(0,0,radius,0,0);
radialGradient.setColorAt(1, QColor(0,82,199));
radialGradient.setColorAt(0.92, Qt::transparent);
//设置画刷
painter.setBrush(radialGradient);
//大圆减小圆
painter.drawPath(outRing.

最低0.47元/天 解锁文章
6493





