前言

这里使用另一套框架写的雷达扫描图

这里PaintEvent事件比上一个版本写的好,但是不喜欢Widget嵌套的方式,后续会把两个版本整合到一起。

一、实现原理

雷达效果包括三个部分:背景、转动的扇形和闪烁的点。 
(1)背景的实现很简单,首先填充背景色,然后绘制横纵坐标轴以及三个同心圆。代码如下:

//背景painter.fillRect(rect(),QColor(15,45,188));//边长int len = m_drawArea.width();//底盘(x轴、y轴和3个圆)painter.setPen(QPen(Qt::white));painter.drawLine(m_drawArea.topLeft() + QPoint(0,len/2),m_drawArea.topRight() + QPoint(0,len/2));painter.drawLine(m_drawArea.topLeft() + QPoint(len/2,0),m_drawArea.bottomLeft() + QPoint(len/2,0));painter.drawEllipse(m_drawArea.center(),len/2,len/2);painter.drawEllipse(m_drawArea.center(),len/3,len/3);painter.drawEllipse(m_drawArea.center(),len/6,len/6);

在这里有个m_drawArea是用来描述绘制雷达的区域的。先确定这个绘制区域,更容易计算绘制的内容。 m_drawArea的大小在resizeEvent事件中确定。

void CRadar::resizeEvent(QResizeEvent *event)
{//以较短的边长作为绘制区域边长if(width() > height()){m_drawArea = QRect((width() - height())/2,0,height(),height());}else{m_drawArea = QRect(0,(height() - width())/2,width(),width());}m_drawArea.adjust(10,10,-10,-10);
}

为了确保雷达为圆形,我们以较短的边作为矩形的边长。然后使用adjust缩小一点。adjust前两个参数为左上角x和y的增量,后两个参数为右下角x和y的增量。

(2)转动部分由一个扇形和一条直线组成。扇形使用了锥形渐变色。代码如下:

    //转动部分//---//线qreal x = m_drawArea.center().x() + (qreal)len/2 * cos(-m_pieRotate*3.14159/180);qreal y = m_drawArea.center().y() + (qreal)len/2 * sin(-m_pieRotate*3.14159/180);painter.setPen(QPen(Qt::white));painter.drawLine(m_drawArea.center(),QPointF(x,y));//----//扇形QConicalGradient gradient;gradient.setCenter(m_drawArea.center());gradient.setAngle(m_pieRotate + 180); //渐变与旋转方向恰好相反,以扇形相反的边作为渐变角度。gradient.setColorAt(0.4,QColor(255,255,255,100)); //从渐变角度开始0.5 - 0.75为扇形区域,由于Int类型计算不精确,将范围扩大到0.4-0.8gradient.setColorAt(0.8,QColor(255,255,255,0));painter.setBrush(QBrush(gradient));painter.setPen(Qt::NoPen);painter.drawPie(m_drawArea,m_pieRotate*16,90*16);

直线的绘制很简单,只需要计算转动角度对应圆上的点的坐标即可。扇形的绘制也很简单。难点在于渐变色的应用,由于锥形渐变是逆时针的,而我们的雷达是顺时针的转动。所以要计算好扇形区域在渐变的哪个范围。这里设置了渐变角度为扇形角度旋转180度,那么扇形区域应该在渐变角度的0.5 - 0.75范围内。由于这里使用的是int类型,怕计算的不精确,将渐变颜色的范围设置大一些。

(3)第三部分是随机闪烁的点,用来点缀。在这里使用了一个list存放点的坐标,另一个list存放这些点的颜色alapha值。使用一个定时器随机改变这些点的坐标值和alapha值。


void CRadar::timerEvent(QTimerEvent *event)
{if(m_timerId == event->timerId()){m_pieRotate -= 10;update();}else if(m_pointTimerId == event->timerId()){//随机更换装饰的点for(int i = 0; i < m_points.count(); ++i){int offsetX = rand()%m_drawArea.width();int offsetY = rand()%m_drawArea.width();int alapha = rand()%255;m_points.replace(i,QPoint(offsetX,offsetY) + m_drawArea.topLeft());m_pointsAlapha.replace(i,alapha);}update();}
}

第一个定时器是用来改变转动部分的角度的。第二个定时器才是用来改变闪烁点的。


二、代码区

radar.h

#ifndef RADAR_H
#define RADAR_H#include <QWidget>class Radar : public QWidget
{Q_OBJECTpublic:Radar(QWidget *parent);~Radar();
protected:void paintEvent(QPaintEvent *event);    //绘制事件void resizeEvent(QResizeEvent *event);  //大小重置事件void timerEvent(QTimerEvent *event);    //定时器事件
private:QRect         m_drawArea;      //绘制区域int           m_pieRotate;     //扇形旋转区域int           m_timerId;       //定时器IDint           m_pointTimerId;  //变更点定时器int           m_nSpeed;        //速度QList<QPoint> m_points;        //绘制点QList<int>    m_pointsAlapha;  //绘制点颜色alapha值};#endif // RADAR_H

radarscannice.h

#ifndef RADARSCANNICE_H
#define RADARSCANNICE_H#include <QtWidgets/QWidget>
#include "ui_radarscannice.h"class RadarScanNice : public QWidget
{Q_OBJECTpublic:RadarScanNice(QWidget *parent = 0);~RadarScanNice();private:Ui::RadarScanNiceClass ui;
};#endif // RADARSCANNICE_H

radar.cpp

#include "radar.h"
#include <QPainter>
#include <QTimerEvent>
#include <QConicalGradient>
#include <qDebug>Radar::Radar(QWidget *parent): QWidget(parent)
{//初始化m_pieRotate = 0;m_timerId = -1;m_nSpeed = 50;m_points << QPoint() << QPoint() << QPoint() << QPoint() << QPoint();m_pointsAlapha << 100 << 100 << 100 << 100 << 100;//启动定时器m_timerId = startTimer(m_nSpeed);m_pointTimerId = startTimer(1200);
}Radar::~Radar()
{}
void Radar::paintEvent(QPaintEvent *event)
{QPainter painter(this);//抗锯齿painter.setRenderHint(QPainter::Antialiasing);//背景painter.fillRect(rect(), QColor(15, 45, 188));//边长int len = m_drawArea.width();//底盘(x轴、y轴和3个圆)painter.setPen(QPen(Qt::white));painter.drawLine(m_drawArea.topLeft() + QPoint(0, len / 2), m_drawArea.topRight() + QPoint(0, len / 2));painter.drawLine(m_drawArea.topLeft() + QPoint(len / 2, 0), m_drawArea.bottomLeft() + QPoint(len / 2, 0));painter.drawEllipse(m_drawArea.center(), len / 2, len / 2);painter.drawEllipse(m_drawArea.center(), len / 3, len / 3);painter.drawEllipse(m_drawArea.center(), len / 6, len / 6);//转动部分//---//线qreal x = m_drawArea.center().x() + (qreal)len / 2 * cos(-m_pieRotate*3.14159 / 180);qreal y = m_drawArea.center().y() + (qreal)len / 2 * sin(-m_pieRotate*3.14159 / 180);painter.setPen(QPen(Qt::white));painter.drawLine(m_drawArea.center(), QPointF(x, y));//----//扇形QConicalGradient gradient;gradient.setCenter(m_drawArea.center());gradient.setAngle(m_pieRotate + 180); //渐变与旋转方向恰好相反,以扇形相反的边作为渐变角度。gradient.setColorAt(0.4, QColor(255, 255, 255, 100)); //从渐变角度开始0.5 - 0.75为扇形区域,由于Int类型计算不精确,将范围扩大到0.4-0.8gradient.setColorAt(0.8, QColor(255, 255, 255, 0));painter.setBrush(QBrush(gradient));painter.setPen(Qt::NoPen);painter.drawPie(m_drawArea, m_pieRotate * 16, 90 * 16);//装饰-随机点for (int i = 0; i < m_points.count(); ++i){int colorAlaph = m_pointsAlapha.at(i);painter.setPen(QPen(QColor(255, 255, 255, colorAlaph), 3));painter.drawPoint(m_points.at(i));}
}void Radar::resizeEvent(QResizeEvent *event)
{//以较短的边长作为绘制区域边长if (width() > height()){m_drawArea = QRect((width() - height()) / 2, 0, height(), height());}else{m_drawArea = QRect(0, (height() - width()) / 2, width(), width());}m_drawArea.adjust(10, 10, -10, -10);
}void Radar::timerEvent(QTimerEvent *event)
{if (m_timerId == event->timerId()){m_pieRotate -= 10;update();}else if (m_pointTimerId == event->timerId()){//随机更换装饰的点for (int i = 0; i < m_points.count(); ++i){int offsetX = rand() % m_drawArea.width();int offsetY = rand() % m_drawArea.width();int alapha = rand() % 255;m_points.replace(i, QPoint(offsetX, offsetY) + m_drawArea.topLeft());m_pointsAlapha.replace(i, alapha);}update();}
}

radarscannice.cpp

#include "radarscannice.h"
#include "radar.h"RadarScanNice::RadarScanNice(QWidget *parent): QWidget(parent)
{ui.setupUi(this);Radar* radar = new Radar(this);radar->setFixedSize(300, 300);radar->move(150, 50);
}RadarScanNice::~RadarScanNice()
{}

main.cpp

#include "radarscannice.h"
#include <QtWidgets/QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);RadarScanNice w;w.show();return a.exec();
}

效果图:

Qt总结之七:QPaintEvent绘制雷达图(二)相关推荐

  1. Qt总结之六:QPaintEvent绘制雷达图

    前言 关于雷达样式可参考文章:https://blog.csdn.net/Aidam_Bo/article/details/84260883 一.代码 头文件.h #ifndef RADARSCAN_ ...

  2. 三种方法绘制雷达图,用最快的时间做出最好看的可视化图表

    雷达图是通过多个离散属性比较对象的最直观工具,掌握绘制雷达图的方法将会为生活和工作带来乐趣. 本例数据来源于网络,某大学本科一年级不同分院学生在五种核心通识能力方面的数据,使用多个工具来绘制多级雷达图 ...

  3. Python matplotlib绘制雷达图

    Python matplotlib绘制雷达图 本篇文章介绍使用matplotlib绘制雷达图. 雷达图也被称为网络图,蜘蛛图,星图,蜘蛛网图,是一个不规则的多边形.雷达图可以形象地展示相同事物的多维指 ...

  4. 带着canvas去流浪系列之六 绘制雷达图

    [摘要] 用canvas原生API实现百度Echarts基本图表. 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvas ...

  5. 【带着canvas去流浪(6)】绘制雷达图

    目录 一. 任务说明 二. 重点提示 三. 示例代码 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文 ...

  6. echarts 雷达图_【带着canvas去流浪】绘制雷达图

    使用原生canvasAPI绘制雷达图.(截图以及数据来自于百度Echarts官方示例库[查看示例链接]). 二. 重点提示 雷达图绘制的看起来并不复杂,无非就是一些路径点的连线,其中的难点都在于一些细 ...

  7. MATLAB绘制雷达图并导出矢量图到Visio编辑(论文用图)

    MATLAB绘制雷达图并导出矢量图到Visio编辑(论文用图) 前言: matlab绘制雷达图   雷达图(Radar Chart)又被叫做蜘蛛网图(Spider Chart),适用于显示三个或更多的 ...

  8. matplotlib绘制雷达图之基本配置——万能模板案例

    目录 介绍 应用场景 案例一(成绩雷达图重叠) 案例二(成绩雷达图左右图) 极坐标 每文一语 介绍 雷达图是以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多变量数据的图形方法.轴的 ...

  9. tableau绘制雷达图(4步法)

    为什么要用tableau? 我称之为(静态.动态图的区别) 我们可以用python,excel进行雷达图的绘制,那么为什么要用tableau? 因为,tableau的图可以是动态的多个视图的整合,你可 ...

最新文章

  1. mac最好用的markdown_Markdown 语法简明教程 amp; Markdown 编辑器推荐
  2. 住酒店套房的注意事项
  3. 使用 Python 进行稳定可靠的文件操作
  4. ITK:计算矢量图像的梯度
  5. 编程实现木马的ActiveX启动和注入IE的启动方式
  6. Proxy 补充学习笔记
  7. 女程序员怀孕7个月坚持上班敲代码
  8. 程序员的自我救赎---4.2:消息中心讲解与应用
  9. java_opts 参数与JVM内存调优
  10. 三国演义词云的python代码_词云制作没那么难,Python 10 行代码就实现了!
  11. java 中的匿名内部类
  12. 张宇1000题高等数学 第八章 一元函数积分学的概念与性质
  13. 一般描绘性形容词_英语中描绘性形容词是指哪种形容词?
  14. 【Cache篇】Linux中的Cache
  15. ArcGIS技巧】下载偏移影像后纠偏操作
  16. 【今日CV 计算机视觉论文速览 第150期】Fri, 2 Aug 2019
  17. 高考30条干货分享!去哪能找到高质量2021高考学习资源?
  18. 运动蓝牙耳机怎么选、几款适合运动的运动耳机
  19. 相机ISO是什么 ISO是什么意思?
  20. 智能+建筑>智能建筑

热门文章

  1. 1.redis单机部署
  2. Mvc5 EF6 CodeFirst Mysql (一) 新建一个Mvc项目并使用EF连接到Mysql数据库
  3. OPTIRRA研究: TNF拮抗剂维持期优化减量方案[EULAR2015_SAT0150]
  4. css知多少(7)——盒子模型
  5. 华三服务器linux系统安装u盘,华三H3CR4900服务器安装linux系统
  6. CentOS7.6安装WirёGuαrd(二)
  7. C++ std:: 的坑
  8. SQL那些事儿(十一)--ODBC,OLE-DB,ADO.NET区别
  9. 笑谈ArcToolbox (5) 非我族类
  10. Golang服务端开发及微服务架构