• 效果图如下:

  • 原理:

自定义控件,并使用QPainter等绘制。
雷达图主要包括的元素有: 同心圆、十字架、文本标签、不同颜色、不同样式的圆圈、余晖等;可以设置目标显示的方位、距离等,经过我的测试,显示100个目标,界面不会卡顿,满足正常环境下的使用。

  • paintEvent()的主要代码:
void SkyplotWidget::paintEvent(QPaintEvent *)
{QSize          widgetSize(this->size());QPalette       p = palette();QPainter      *painter = new QPainter(this);float          topMargin ;float          leftMargin;float          size;float          satelliteSize;float          fontSize;float          availableWidth    = widgetSize.width ();float          availableHeight   = widgetSize.height();if( availableHeight > availableWidth ){size = widgetSize.width() * p_marginScale;topMargin   = ( widgetSize.width() - widgetSize.width() * p_marginScale + widgetSize.height() - widgetSize.width() ) / 2.0;leftMargin  = ( widgetSize.width() - widgetSize.width() * p_marginScale ) / 2.0;}else{size = widgetSize.height() * p_marginScale;leftMargin = ( widgetSize.height() - widgetSize.height() * p_marginScale + widgetSize.width() - widgetSize.height()) / 2.0;topMargin  = ( widgetSize.height() - widgetSize.height() * p_marginScale ) / 2.0;}satelliteSize = size * p_satScale;painter->setRenderHint(QPainter::Antialiasing, p_antialiased);painter->translate( leftMargin, topMargin );  //重新设置坐标原点fontSize = size * p_fontScale;painter->setFont(QFont( "Arial", static_cast< int >(fontSize)));//圆圈for(int i=0; i <= p_ellipses; i++){float radius = size / 2.0 - i * ( size / ( 2.0  * p_ellipses ));painter->setPen( QPen( p_gridColor, p_gridWidth ) );painter->drawEllipse(QPoint( size/2.0, size/2.0 ), static_cast< int >( radius ), static_cast< int >(radius));if(p_withGridLabels){painter->setPen( QPen( p_gridTextColor, p_gridWidth -2.5 ) );double tmp = ((p_ellipses - i) * (mMonitorScope / p_ellipses));QString distance = QString::number(((p_ellipses - i) * (mMonitorScope / p_ellipses)) ,10 , 2);painter->drawText(QPoint(size/2.0 + p_textMargin, size/2.0 - (radius + p_textMargin)), QString("%1 km").arg(distance)); //距离刻度}}//十字架for(int i=0; i < p_crosses; i++){QLineF line1,line2;float angle = (static_cast<float>(i) * 90.0) / (static_cast<float>(p_crosses));line1.setP1( QPoint( size/2.0, size/2.0 ) );line1.setLength( size/2.0 );QRectF textRect(0, 0, 4.0 * fontSize, fontSize + 2.0);for(int c = 0; c < 4; c++){line1.setAngle(angle + c*90.0 + 90.0);painter->setPen(QPen(p_gridColor, p_gridWidth));painter->drawLine(line1);if( p_withGridLabels ){painter->setPen(QPen( p_gridTextColor, p_gridWidth));line2 = QLineF(line1);line2.setLength(size/2.0 + 2.0 * fontSize);textRect.moveCenter(line2.p2());if(i > 0)painter->drawText( textRect, Qt::AlignCenter, QString("%1").arg((int)(360 - (c*90 ) - angle) , 3 , 10 , QChar('0')));else{if(c == 0){painter->drawText( textRect, Qt::AlignCenter,QString("000"));}else if(c == 1){painter->drawText( textRect, Qt::AlignCenter, QString("270"));}else if(c == 2){painter->drawText( textRect, Qt::AlignCenter, QString("180"));}else if(c == 3){painter->drawText( textRect, Qt::AlignCenter, QString("090"));}}}}}QBrush innerBrush = QBrush( Qt::SolidPattern );QBrush outerBrush = QBrush( );//卫星foreach( auto s, satellites ){//------w---设置每一个卫星的大小satelliteSize = size * s.rsize;// skip invisible satellitesif(     s.state & SatelliteState::Invisible       ||  // the invisible flag is set( !( s.state & SatelliteState::Visible ) &         // neither visible nor half-visible!( s.state & SatelliteState::HalfVisible ) ) ||(  s.state & SatelliteState::Flashing && flash )    // flashing flag is set and flash is active)continue;QRectF labelRect( 0, 0, s.label.length() * satelliteSize, satelliteSize+2 );double nmdX = 0,nmdY = 0;  //卫星的X轴坐标,卫星的Y轴坐标calculatePos(s.az , s.distance ,nmdX, nmdY);QPoint satPos(size/2.0 + size*(nmdX/mMonitorScope) * 0.5,size/2.0 +  size*(nmdY/mMonitorScope) * 0.5);// define the color's alpha value (0.3 or 1.0)QColor innerColor = s.innerColor;QColor outerColor = s.outerColor;QColor fontColor  = s.fontColor;if( s.state & SatelliteState::Visible ){innerColor.setAlphaF( 1.0 );outerColor.setAlphaF( 1.0 );fontColor.setAlphaF( 1.0 );}else{innerColor.setAlphaF( 0.3 );outerColor.setAlphaF( 0.3 );fontColor.setAlphaF( 0.3 );}// paint the inner circleinnerBrush.setColor( innerColor );painter->setBrush( innerBrush );if( s.state & SatelliteState::Marked )painter->setPen( QPen( outerColor, satelliteSize/4 ) );elsepainter->setPen( QPen( p_gridColor, 0 ) );painter->drawEllipse( satPos, static_cast< int >( satelliteSize ), static_cast< int >( satelliteSize ) );// write the textpainter->setPen( QPen( fontColor, 2 ) );painter->setFont( QFont( "Arial", static_cast< int >( satelliteSize ),  QFont::Bold ) );labelRect.moveCenter( satPos );painter->drawText( labelRect, Qt::AlignCenter, s.label );}foreach (auto l, indicatrix){if(  l.lineState & SatelliteState::Invisible       ||  // the invisible flag is set( !( l.lineState & SatelliteState::Visible ) &         // neither visible nor half-visible!( l.lineState & SatelliteState::HalfVisible ) ) ||(  l.lineState & SatelliteState::Flashing && flash )    // flashing flag is set and flash is active)continue;QPoint spoint ( l.point1.rx() * size / 100 + size/2, l.point1.ry() * size/100 + size/2);QPoint epoint ( l.point2.rx() * size / 100 + size/2, l.point2.ry() * size/100 + size/2);painter->setPen(QPen(l.lineColor,1.5,Qt::DashDotLine,Qt::RoundCap));painter->drawLine(spoint,epoint);}//余晖扫描//   int len = m_drawArea.width();qreal x = size/2.0 + (qreal)size/2 * cos(-m_pieRotate*3.14159/180);qreal y = size/2.0 + (qreal)size/2 * sin(-m_pieRotate*3.14159/180);painter->setPen(QPen(Qt::green));painter->drawLine(QPoint( size/2.0, size/2.0 ),QPointF(x,y));//扇形QConicalGradient gradient;gradient.setCenter(QPoint( size/2.0, size/2.0 ));gradient.setAngle(m_pieRotate + 180); //渐变与旋转方向恰好相反,以扇形相反的边作为渐变角度。gradient.setColorAt(0.4,QColor(169,253,51,100)); //从渐变角度开始0.5 - 0.75为扇形区域,由于Int类型计算不精确,将范围扩大到0.4-0.8gradient.setColorAt(0.8,QColor(169,253,51,0));painter->setBrush(QBrush(gradient));painter->setPen(Qt::NoPen);painter->drawPie(0,0,size,size,m_pieRotate*16,90*16);//--------------------------------------------------delete painter;
}在这里插入代码片
  • 下载地址:

代码下载地址稍后贴在下方评论区。

Qt绘制雷达图(效果图)相关推荐

  1. Qt绘制雷达图(卫星轨迹图)

    效果图 功能 使用QPainter绘制,雷达图主要包括,同心圆.十字架.刻度.不同颜色的圆圈. 可以设置卫星的俯仰角,方位角,程序采用系统与卫星的结合,多种系统,n个卫星数据,进行显示,可自行搭配数据 ...

  2. 使用QT绘制雷达扫描效果

    话不多说直接上代码,代码规范性可能差了点,但是效果得以实现,在这里记录一下. 源码工程在这里下载地址 scan.h的代码如下 #ifndef SCAN_H #define SCAN_H#include ...

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

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

  4. 利用Canvas绘制雷达图

    雷达图(蜘蛛网图)是一种常见的数据分析图表,本文采用canvas来绘制雷达图,并最终封装成一个小组件.首先来看一下最终的效果图: 如何画正多边形 以正五边形雷达图为例(其他任意正多边形也一样),如下图 ...

  5. pygal的简单应用:利用pygal库分别绘制雷达图、柱状图和折线图

    在Python中,pygal 是一个常用数据可视化的数据图库,它以面向对象的方式来创建各种数据图,而且使用 pygal 可以非常方便地生成各种格式的数据图,包括 PNG.SVG.JPG .GIF等.使 ...

  6. python雷达图数据_PYTHON绘制雷达图代码实例

    这篇文章主要介绍了PYTHON绘制雷达图代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.雷达图 import matplotlib.py ...

  7. python【Matlibplot绘图库】利用matlibplot绘制雷达图

    文章目录 1.基本构造 2.比较功能 1.基本构造 之前在一些数据分析案例中看到用 Go 语言绘制的雷达图,非常的漂亮,就想着用matlibplot.pyplot也照着画一个,遗憾的是matlibpl ...

  8. 圆形和多边形雷达图python-Matplotlib绘制雷达图和三维图的示例代码

    1.雷达图 程序示例 '''1.空白极坐标图''' import matplotlib.pyplot as plt plt.polar() plt.show() '''2.绘制一个极坐标点''' im ...

  9. python话雷达图-PYTHON绘制雷达图代码实例

    这篇文章主要介绍了PYTHON绘制雷达图代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.雷达图 import matplotlib.py ...

最新文章

  1. 单机训练速度提升高达640倍,快手开发GPU广告模型训练平台
  2. 如何在HTTP POST请求中发送参数?
  3. 统计概率分布_概率统计中的重要分布
  4. ajax实现局部删除,Express+AdminLTE+hbs+Ajax实现局部刷新终极版(第二部分)
  5. 【OP放大器】在不拆开OP放大器的情况下查一查它是否坏掉或饱和。
  6. git 本地项目上传
  7. 使用LDAP查询快速提升域权限
  8. Checkbox和RadioRadioButton及其实例
  9. bpm js 计算 音乐_构建Node.js和Arduino执行控制
  10. 手把手教你如何生成自己的二维码
  11. 用计算机信息术语感恩老师,感恩老师的祝福语(精选50句)
  12. 虚拟软盘启动OS方法
  13. 孙溟㠭20载艺术之路
  14. MATLAB数字图像处理系统——边缘检测
  15. Win10.VS2017.Cmake.配置protobuf
  16. c语言hid,HIDAPI首页、文档和下载 - HID 设备的 C 语言通用库
  17. 奥巴马就职演说的语言艺术
  18. Big-man进军Linux系统(一)
  19. 大红喜庆版UI猜灯谜又叫猜字谜微信小程序源码下载
  20. 音视频直播如何实现低延迟

热门文章

  1. 更相减损法一定要约分吗_如何回应利润分成要约
  2. 大型门户网站推广的方法
  3. 程序设计教程用c 语言编程,程序设计教程:用C/C++语言编程
  4. Pbuilder编译PHP文件,2016 年 1 月 23 日
  5. 推断统计:参数估计和假设检验
  6. 如何获得汽车控制权限?
  7. 什么软件可以测试电路板,在线测试仪的功能及在电路板维修中的应用
  8. 【电路设计】将AC交流电转换为DC直流电
  9. android动画(十四)
  10. ROI感兴趣区域提取与泛洪填充