首页 > 其他分享 >Qt实现仪表盘

Qt实现仪表盘

时间:2023-02-19 21:31:33浏览次数:31  
标签:20 Qt 实现 setColorAt int 仪表盘 MainWindow painter

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_foreground = Qt::magenta;
m_background = Qt::black;
m_title = "温度";
m_startAngle = 45;
m_endAngle = 45;
m_scaleMajor = 10;
m_minValue = 0;
m_maxValue = 50;
m_scaleMinor = 5;
m_value = 0;

}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QFont font("宋体", 14);
painter.setFont(font);
painter.setRenderHint(QPainter::Antialiasing);
painter.translate(width() / 2, height() / 2);
//坐标变换为窗体中心
int side = qMin(width(), height());
painter.scale(side / 400.0, side / 400.0);
//比例缩放
drawCrown(&painter);
//画表盘边框
drawScaleNum(&painter);
//画刻度数值
drawScale(&painter);
//画刻度线
drawTitle(&painter);
//画单位
// drawNumericValue(&painter);
//画数字显示
drawIndicator(&painter);
}

void MainWindow::drawCrown(QPainter *painter)
{
painter->save();
int radius = 200;
painter->setBrush(m_background = QColor(20,20,20));
QLinearGradient lg1(0, -220, 0, 220);
lg1.setColorAt(0, Qt::darkCyan);
lg1.setColorAt(1, QColor(20, 20, 20));
painter->setBrush(lg1);
painter->setPen(Qt::NoPen);
painter->drawEllipse(-radius, -radius, radius << 1, radius <<1);
painter->setBrush(m_background = QColor(20, 20, 20));
painter->drawEllipse(-180, -180, 360, 360);
painter->restore();
}

void MainWindow::drawTitle(QPainter *painter)
{
painter->save();
painter->setPen(QColor(220,200,200,200));
QString str(m_title);
QFontMetricsF fm(this->font());
painter->drawText(-30, -50, str);
painter->restore();
}

void MainWindow::drawScaleNum(QPainter *painter)
{
painter->save();
painter->setPen(QPen(QColor(255,255,255)));
QFontMetricsF fm(this->font());
int radius = 200;
int r=(int)(radius*0.8);
int Angle=45;
int gap = (360-Angle*2) / 10;
for(int i=0; i<=10; i+=1)
{
int angle = 90+Angle+gap*i; //角度,每隔10格子画一个刻度值
float angleArc =( angle % 360) * 3.14159 / 180; //转换为弧度
int x = (r)*cos(angleArc);
int y = (r)*sin(angleArc);
QString value =QString( "%1" ).arg(i*5);
//字体大小及位置要微调
int h = fm.size(Qt::TextSingleLine,value).height();
x = x -10;
y = y + h/2;
painter->drawText(QPointF(x, y),value);
}
painter->restore();
}

void MainWindow::drawScale(QPainter *painter)
{
painter->save();
painter->rotate(m_startAngle);
int steps = (m_scaleMajor * m_scaleMinor); //总刻度数量
double angleStep = (360.0 - m_startAngle - m_endAngle) / steps; //每一个份数的角度
for (int i = 0; i <= steps; i++)
{
if (i % m_scaleMinor == 0) //大刻度
{
QPen pen ;
pen.setColor(Qt::lightGray);
pen.setWidth(2);
painter->setPen(pen);
painter->drawLine(0, 125, 0, 145);
}
else //小刻度
{
QPen pen ;
pen.setColor(Qt::darkGray);
pen.setWidth(1);
painter->setPen(pen);
painter->drawLine(0, 125, 0, 135);
}
painter->rotate(angleStep);
}
painter->restore();
}

void MainWindow::drawIndicator(QPainter *painter)
{
painter->save();
QPolygon pts;
pts.setPoints(5, -2,0, -4,30, 0,120, 4,30, 2,0);
//第一个参数是坐标的个数,记下来是坐标
painter->rotate(m_startAngle);
double degRotate = (360.0 - m_startAngle - m_endAngle)/(m_maxValue - m_minValue)*(m_value - m_minValue);

//画指针
painter->rotate(degRotate);

//顺时针旋转坐标系统
QRadialGradient haloGradient(0, 0, 60, 0, 0);
//辐射渐变
haloGradient.setColorAt(0, QColor(60,60,60));
haloGradient.setColorAt(1, QColor(160,160,160));
painter->setPen(Qt::yellow);
//定义线条文本颜色 设置线条的颜色
painter->setBrush(haloGradient);
//刷子定义形状如何填满 填充后的颜色
painter->drawConvexPolygon(pts);
painter->restore();
//画中心点
QColor niceBlue(150, 150, 200);
QConicalGradient coneGradient(0, 0, -90.0);
//角度渐变
coneGradient.setColorAt(0.0, Qt::darkGray);
coneGradient.setColorAt(0.2, niceBlue);
coneGradient.setColorAt(0.5, Qt::yellow);
coneGradient.setColorAt(1.0, Qt::darkGray);
painter->setPen(Qt::NoPen);
painter->setBrush(coneGradient);
painter->drawEllipse(-8, -8, 16, 16);
}


Qt实现仪表盘_Qt

标签:20,Qt,实现,setColorAt,int,仪表盘,MainWindow,painter
From: https://blog.51cto.com/u_15515702/6066840

相关文章

  • 各大排序算法的优缺点以及实现方法
    这篇文章,我们来谈谈一些关于排序的东西注意!这篇文章在写的时候混淆了一个概念,“稳定”本义指的是能保证两个相等的数,经过排序之后,序列的前后位置顺序不变。在本文中理解成......
  • 树与二叉树的基础概念与代码实现
    树与二叉树的基础概念与代码实现树,其实跟我们现实生活中的树是差不多的。如果你还不了解树这个数据结构的话,你可能认为树是这样的:但事实正好相反,在数据结构当中,树的模......
  • 外部排序【java实现】
    外部排序什么是外部排序?外部排序是一种把大量无序的数据,按一定的顺序排序的算法。它是一种非常适合处理海量数据的算法,其原理主要有以下几点:首先,将所有要排序的数据分......
  • 64-CICD持续集成工具-Jenkins实现自动化任务构建
    周期性构建概念:周期性构建这是—-种基于cron类型的构建机制.按照预定义的时间周期性启动作务对于期望能够基于代码变更进行触的CI场景来说,周期性构建并非其最佳选项,但对于......
  • element-plus实现table表格序号递增的效果
    element-plus组件排序,可以给序号行加一个type="index"就可以实现按序号排序效果,但是当页码到第二页时,又是从一开始排列了。想要实现的效果是翻页后页码接上一页的顺序......
  • echarts实现3个y轴的图表
    option={xAxis:{type:'category',data:['Mon','Tue','Wed','Thu','Fri','Sat','Sun','Mon','Tue','Wed','Thu',]}......
  • 【Python】Python实现提前查询考研成绩
    ✨Python实现提前查询考研成绩自命题院校可能会在考研成绩正式发布之前将成绩上传到研招网,并进行测试此时就可以提前查询到专业课成绩✨使用说明填写相关信息使用时......
  • strlen(模拟实现和详细介绍)
    模拟实现方法一(常规)#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<assert.h>intmy_strlen(constchar*str){assert(*str!=NULL);intcount=0;w......
  • JavaScript中深拷贝和浅拷贝有什么区别?如何实现深拷贝?
    前言大家好,我是CoderBin,本次讲讲深拷贝和浅拷贝有什么区别?以及如何实现深拷贝?。希望对大家有所帮助,谢谢!如果文中有不对、疑惑的地方,欢迎在评论区留言指正......
  • 电商导购CPS,淘宝联盟如何跟单实现用户和订单绑定
    前言大家好,我是小悟做过自媒体的小伙伴都知道,不管是发图文还是发短视频,直播也好,可以带货。在你的内容里面挂上商品,你自己都不需要囤货,如果用户通过这个商品下单成交了,自媒体......