#include "radarwidget.h"
#include "ui_radarwidget.h"
#include <QDebug>
#include <QPainter>
RadarWidget::RadarWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::RadarWidget)
{
ui->setupUi(this);
resize(700,450);
rowGridCount = 6;
columnGridCount = 6;
radius = 210; //(窗口长度-30) / 2
rect = QRectF(0,0,700,450);
}
RadarWidget::~RadarWidget()
{
delete ui;
}
void RadarWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
drawBg(painter);
drawGrid(painter); //绘制背景表格
drawArc(painter); //绘制圆弧
drawDial(painter); //绘制刻度盘
drawArcBg(painter); //绘制圆弧背景
drawScale(painter); //绘制刻度
}
void RadarWidget::drawBg(QPainter &painter)
{
painter.save();
painter.setBrush(QColor(44,62,80));
painter.drawRect(0,0,700,450);
painter.restore();
}
void RadarWidget::drawGrid(QPainter &painter)
{
painter.save(); //保存绘画状态
QPen pen;
// QColor tmpColor = AppInstance
QColor tmpColor = QColor(56,133,115); //56 133 115
tmpColor.setAlpha(150); //设置透明度 0 ~ 255
pen.setColor(tmpColor);
pen.setCapStyle(Qt::RoundCap); //用于设置画笔的端点属性为圆形端点
pen.setWidthF(0.5); //设置线宽
painter.setPen(pen);
QRectF gridRect = rect.adjusted(6,6,-6,-6);
qreal gridHeight = gridRect.height()*1.0/columnGridCount;
qreal gridWidth = gridRect.width()*1.0/rowGridCount;
for(int row = 0;row<=rowGridCount;row++){
painter.drawLine(gridRect.x(),gridRect.y()+gridHeight*row,
gridRect.x()+gridRect.width(),gridRect.y()+gridHeight*row);
}
for(int column = 0;column<=columnGridCount;column++){
painter.drawLine(gridRect.x()+gridWidth*column,gridRect.y(),
gridRect.x()+gridWidth*column,gridRect.y()+gridRect.height());
}
painter.restore();
}
void RadarWidget::drawArc(QPainter &painter)
{
painter.save();
QColor tmpColor = QColor(39 ,174 ,96); //39 174 96
painter.setBrush(tmpColor);
QPainterPath ellipsePath;
// painter.translate(-radius,-radius);
ellipsePath.addEllipse(0,0,2*radius,2*radius);
QPainterPath subPath;
int arcWidth = 6;
subPath.addEllipse(arcWidth,arcWidth,2*(radius-arcWidth),2*(radius-arcWidth));
ellipsePath -= subPath; //空心圆
painter.drawPath(ellipsePath);
painter.restore();
}
void RadarWidget::drawDial(QPainter &painter)
{
painter.save();
painter.translate(radius,radius);
// // 获取当前 painter 视口坐标系的边界
// QRectF viewportRect = painter.viewport();
// // 转换为窗口坐标系的边界
// QRectF windowRect = painter.window();
// // 将坐标值存入变量中
// qreal viewportX = viewportRect.x();
// qreal viewportY = viewportRect.y();
// qreal windowX = windowRect.x();
// qreal windowY = windowRect.y();
// qDebug()<<"view: " <<"("<<viewportX<<","<<viewportY<<")";
// qDebug()<<"window: " <<"("<<windowX<<","<<windowY<<")";
QColor tmpColor = QColor(56,133,115); //56 133 115
painter.setPen(tmpColor);
QFont font = painter.font();
font.setPointSize(9); //字体大小
font.setWeight(60); //设置字体粗细
painter.setFont(font);
int scaleMajor = 36;
int _radius = radius - 26;
qreal q = 0;
for(int i=0;i<scaleMajor;i++){
int value = 1.0*i*(360/scaleMajor);
//生成指定宽度、使用十进制数字、左侧补零的字符串形式,并赋值给 strValue 变量。
QString strValue = QString("%1").arg(value,3,10,QLatin1Char('0'));
painter.save();
painter.rotate(q);
qreal l = painter.fontMetrics().width(strValue)/2.0;
painter.drawText(QPointF(-l,-_radius),strValue);
painter.restore();
q=q+10;
}
painter.restore();
}
void RadarWidget::drawArcBg(QPainter &painter)
{
painter.save();
int aphpaRadius = radius - 30;
QColor tmpColor = QColor(44,62,81); //56 133 115
tmpColor.setAlpha(150);
painter.setPen(Qt::NoPen); //设置画笔为无色
painter.setBrush(tmpColor);
// painter.translate(-aphpaRadius,-aphpaRadius);
painter.drawEllipse(30,30,2*aphpaRadius,2*aphpaRadius);
painter.restore();
}
void RadarWidget::drawScale(QPainter &painter)
{
painter.save();
int scaleMajor = 36;
int _radius = radius - 30;
painter.rotate(0);
painter.translate(radius,radius);
//测试translate和rotate的作用: 移动坐标系, 默认坐标系原点在(0,0)
// painter.translate(radius,radius);
// painter.drawLine(0,-_radius,0,50-_radius);
// painter.rotate(90);
// painter.setPen(QColor(255,0,0));
// painter.drawLine(0,-_radius,0,50-_radius);
int subScaleMajor = 10;
int midScaleMajor = subScaleMajor/2;
int steps = (scaleMajor*subScaleMajor);
double angleStep= 360.0/steps;
QPen pen;
QColor tmpColor = QColor(41,118,88);
pen.setColor(tmpColor);
pen.setCapStyle(Qt::RoundCap); //端点是圆的
for(int i=0;i<=steps;i++){
if(i%subScaleMajor == 0){
pen.setWidthF(1.5);
painter.setPen(pen);
painter.drawLine(0,-_radius,0,-_radius+15);
}else if(i%midScaleMajor==0){
pen.setWidthF(1.0);
painter.setPen(pen);
painter.drawLine(0,-_radius,0,-_radius+10);
}else{
pen.setWidthF(0.5);
painter.setPen(pen);
painter.drawLine(0,-_radius,0,-_radius+5);
}
painter.rotate(angleStep);
}
painter.restore();
}
雷达图+qt+绘制雷达图
需积分: 0 188 浏览量
更新于2023-05-21
6
收藏 7KB ZIP 举报
使用qt绘制雷达图,通过这个小案例,你可以了解qt技术,以及对QPainter有一个新的认识,里面的编码规范也有借鉴意义,有详细注释,通过这个案例的学习,你可以根据自己的需要进行改进,或者照猫画虎,在重新实现一下,重点要理解translate和rorate在这个RadarDemo中的巧妙作用,要思考一下,它是如何将多个绘画结合在一起的,总之,通过这个案例,你会有一个新的认识。

12赞
- 粉丝: 46
最新资源
- 网络配送合作协议书范本.doc
- 智慧城轨信息化建设方案.docx
- 项目管理一般知识.ppt
- 电力线宽带(PLC)接入合作协议书模板.doc
- 电子商务中的数字水印技术应用研究论文.doc
- 自动化专业求职信400字(六篇).docx
- 2020年本科网站设计开题报告.doc
- 基于单片机的环境安全系统的设计.doc
- 数据挖掘决策树遗传算法神经网络算法硕士论文.doc
- 电子商务文案写作完整全套教学课件.ppt
- 基于单片机的超声波测距系统大学学位论文.doc
- 算法与算法框图含解析.docx
- 嵌入式WEB服务器的设计与实现毕业论文.doc
- PLC在工厂供电自动化系统中的应用探析论文.doc
- 网店运营推广方案Excel模板.xlsx
- 智能家居技术方案29.docx.docx