qt制作雷达图

Qt绘制雷达图(卫星轨迹图) Qt绘制卫星轨迹图 阅读详情

#ifndef CRADARDLG_H
#define CRADARDLG_H

 
#include <QDialog>

 

 
#include <qwidget>
#include <qpainter>
#include <qpainterpath>
#include <qmap>
#include "qmath.h"
#include <QDebug>

 
enum RadarType
{
    Radar=0,  //雷达图
    Spider    //蜘蛛网图
};

 
enum PointTpye
{
    ScatterPoints=0, //散点图
    LinePoints       //连线图
};

 
typedef struct RadarData
{
    QColor color;
    QMap<qreal,qreal> datamap;           //key : 角度 value:值
    QMap<qreal,qreal> transitiondatmap;  //key : 角度 value:转换的值

 

 
}RadarData;

 
#define  PI 3.14159

 

 
namespace Ui {
class CRadarDlg;
}

 
class CRadarDlg : public QDialog
{
    Q_OBJECT

 
public:
    explicit CRadarDlg(QWidget *parent = 0);
    ~CRadarDlg();

 
    void setRadarType(RadarType radartype);
    void setPointTpye(PointTpye pointstype);
protected:
    void paintEvent(QPaintEvent *);

 
private:
    void init();
    void drawRadarType(QPainter *painter);
    void drawRadar(QPainter *painter);
    void drawSpider(QPainter *painter);
    void drawAxisLabel(QPainter *painter);
    void drawLabel(QPainter *painter);
    void drawData(QPainter *painter);
    void drawScatterPoints(QPainter *painter);
    void drawLinePoints(QPainter *painter);

 

 
private:
    Ui::CRadarDlg *ui;

 
    RadarType m_radartype;
    PointTpye m_pointstype;
    int m_cylindernum;  //圈数
    int m_lineangle;    //角度,决定多少。默认是30
    int m_Axis_max,m_Axis_min; //最大最小
    QStringList m_AxisLabelList; //标签 刻度标签
    QStringList m_labelList;     //外围标签
    bool m_showAxisLabel;
    bool m_showLabel;

 
    QMap<int,RadarData> m_datamap;  //key 表示组,value表示对于的值
    QList<QColor> m_colorlist;
};

 
#endif // CRADARDLG_H

 

 

 



#include "cradardlg.h"
#include "ui_cradardlg.h"

 
CRadarDlg::CRadarDlg(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::CRadarDlg)
{
    ui->setupUi(this);

 
    init();
}

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

 
void CRadarDlg::setRadarType( RadarType radartype )
{
    m_radartype = radartype;
}

 
void CRadarDlg::setPointTpye( PointTpye pointstype )
{
    m_pointstype = pointstype;
}

 

 
void CRadarDlg::init()
{
    //    setRadarType(Radar);
    setRadarType(Spider);
    setPointTpye(LinePoints);
    m_cylindernum = 5;  //默认6圈
    m_lineangle = 60; //默认30度
    m_showAxisLabel = true;
    m_Axis_min = 0;
    m_Axis_max = 100;
    m_AxisLabelList << "0" << "20" << "40" << "60" << "80" << "100";

 
    for (int i = 0 ; i < 360; i+=m_lineangle)
    {
        //        m_labelList << QString("%1").arg(i);
        m_labelList<<"hello";
    }
    RadarData tlist2;//tlist1,
    QMap<qreal,qreal> datamap,datamap2;
    for (int i = 0; i < 6;++i)
    {
        datamap2 .insert (i*60,i*8.2+10);
        datamap .insert(i*60,i*5);
    }
    //    tlist1.color = QColor(136,68,255);
    tlist2.color = QColor(146,39,143);

 
    //    tlist1.transitiondatmap = datamap;
    tlist2.transitiondatmap = datamap2;

 
    m_datamap.insert(0,tlist2);
    //    m_datamap.insert(1,tlist1);

 
    //显示标志
    m_showLabel=true;

 
}

 

 
void CRadarDlg::paintEvent( QPaintEvent * )
{
    QPainter *painter = new QPainter(this);
    painter->setRenderHint(QPainter::Antialiasing);
    painter->setRenderHint(QPainter::SmoothPixmapTransform);
    painter->setRenderHint(QPainter::TextAntialiasing);

 
    //添加背景颜色
    //  painter->save();
    //  painter->setBrush(Qt::blue);
    //  painter->drawRect(0,0,width(),height());
    //  painter->restore();
    //////////////////////////////////////////////////////////////////////////

 
    drawRadarType(painter);//画雷达图基图,底图
    drawAxisLabel(painter);//x轴刻度显示
    drawLabel(painter);//显示标志
    drawData(painter);

 
}

 

 
void CRadarDlg::drawRadarType( QPainter *painter )
{
    switch (m_radartype)
    {
    case Radar:drawRadar(painter);break;
    case Spider:drawSpider(painter);break;
    default:drawRadar(painter);break;
    }
}

 

 
void CRadarDlg::drawRadar( QPainter *painter )
{
    painter->save();
    QPen pen;
    QColor color(Qt::lightGray);
    pen.setWidthF(0.4);
    //pen.setColor(color/*.lighter(100)*/); //添加线的颜色
    painter->setPen(pen);

 
    QPainterPath looppath;
    int w = width();
    int h = height();

 
    int count = m_cylindernum;
    int radius = qMin(w,h);
    int step = radius/(count+1);  //加1是为了四周留出空间,写标签
    int x = w*0.2;
    int y = h*0.2;

 
    QRectF outrect;
    for (int i = 1; i < count+1; ++i)
    {
        radius = step*i;
        x = w/2-radius/2;
        y = h/2-radius/2;
        QRectF rect(x,y,radius,radius);
        looppath.addEllipse(rect);
        outrect = rect;
    }
    painter->drawPath(looppath);
    //////////////////////////////////////////////////////////////////////////

 
    if (m_lineangle == 0)
    {
        m_lineangle =90;
    }
    int linecount = 360/m_lineangle;
    int x0 = w/2 ;
    int y0 = h/2;
    int newradius = outrect.height()/2;
    for (int i = 0 ; i < linecount; ++i)
    {
        int x1 = x0 + newradius*qSin(PI*2/linecount*i);
        int y1 = y0 + newradius*qCos(PI*2/linecount*i);

 
        painter->drawLine(x0,y0,x1,y1);
    }

 
    painter->restore();

 
}

 
void CRadarDlg::drawSpider( QPainter *painter )
{
    painter->save();
    QPen pen;
    QColor color(Qt::blue);
    pen.setWidthF(0.4);
    pen.setColor(color/*.lighter(100)*/); //添加线的颜色
    painter->setPen(pen);

 
    //    QPainterPath looppath;
    int w = width();
    int h = height();
    //    if (m_lineangle == 0)
    //    {
    //        m_lineangle =90;
    //    }

 
    int  laycount = m_cylindernum;  //默认是几层

 
    int count = 360/m_lineangle;
    int radius = qMin(w,h)/2;
    int x0 = w/2 ;
    int y0 = h/2;

 
    for (int j = 1 ; j < laycount+1; ++j)
    {
        int newradius = radius*j/(laycount+1);
        for (int i = 0 ; i < count; ++i)
        {
            int x1 = x0 + newradius*qSin(PI*2/count*i);
            int y1 = y0 + newradius*qCos(PI*2/count*i);
            painter->drawLine(x0,y0,x1,y1);//从中心发射的直线

 
            int x2;
            int y2;
            if (i == count*2-1)
            {
                x2 = x0 + newradius*qSin(0);
                y2 = y0 + newradius*qCos(0);
            }
            else
            {
                x2 = x0 + newradius*qSin(PI*2/count*(i+1));
                y2 = y0 + newradius*qCos(PI*2/count*(i+1));
            }
            painter->drawLine(x1,y1,x2,y2);//每层的封线
        }
    }
    //    painter->drawPath(looppath);

 
    painter->restore();

 
}

 
void CRadarDlg::drawAxisLabel( QPainter *painter )
{
    if (!m_showAxisLabel) return;

 
    painter->save();

 

 
    int  laycount = m_cylindernum;  //默认是几层
    int w = width();
    int h = height();
    //    int count = 360/m_lineangle;
    int radius = qMin(w,h)/2;
    int x0 = w/2 ;
    int y0 = h/2;

 
    QFont font;
    int fontsize = 10;
    if (h > 500)
        fontsize = 15;
    font.setPointSize(fontsize);
    painter->setFont(font);

 
    for (int j = 0 ; j < laycount+1; ++j)
    {
        int newradius = radius*j/(laycount+1);
        int x1 = x0 + newradius*qSin(PI);
        int y1 = y0 + newradius*qCos(PI)+20;
        if (j < m_AxisLabelList.count())
        {
            painter->drawText(x1,y1,m_AxisLabelList.at(j));
        }
    }

 
    painter->restore();
}

 
void CRadarDlg::drawLabel( QPainter *painter )
{
    if (!m_showLabel) return;

 
    painter->save();

 
    //QPen pen;
    //QColor color(Qt::lightGray);
    //pen.setColor(color/*.lighter(100)*/); //添加线的颜色
    //painter->setPen(pen);

 

 
    int  laycount = m_cylindernum;  //默认是几层
    int w = width();
    int h = height();
    int count = 360/m_lineangle;
    int radius = qMin(w,h)/2;
    int x0 = w/2 ;
    int y0 = h/2;

 
    QFont font;
    int fontsize = 10;
    if (h > 500)
        fontsize = 15;
    font.setPointSize(fontsize);
    painter->setFont(font);

 

 
    for (int i = 0 ; i < count; ++i)
    {
        int newradius = radius*laycount/(laycount+1)+10;
        newradius = newradius+10*qSin(PI*2/count*i);
        int x1 = x0 - newradius*qSin(PI*2/count*i);
        int y1 = y0 - newradius*qCos(PI*2/count*i);

 
        if (y0 < y1 && x0 < x1)
        {
            y1 -= fontsize*qSin(PI*2/count*i);
        }
        else
        {
            if (x1 < x0)
                x1-=fontsize;
            y1 += fontsize*qSin(PI*2/count*i);
        }
        if (i < m_labelList.count())
        {
            painter->drawText(x1,y1,m_labelList.at(i));
        }

 
    }

 
    painter->restore();
}

 
void CRadarDlg::drawData( QPainter *painter )
{
    switch(m_pointstype)
    {
    case ScatterPoints:drawScatterPoints(painter);break;
    case LinePoints:drawLinePoints(painter);break;
    default:drawLinePoints(painter);break;
    }

 
}

 
void CRadarDlg::drawScatterPoints( QPainter *painter )
{
    painter->save();

 
    int w = width();
    int h = height();
    //    int count = 360/m_lineangle;
    int radius = qMin(w,h)/2*m_cylindernum/(m_cylindernum+1);

 
    QList<int> keyilist = m_datamap.keys();

 
    qreal step = 1.0*radius/(m_Axis_max-m_Axis_min);
    foreach (qreal key, keyilist)
    {
        RadarData rdata = m_datamap.value(key);
        QColor color = rdata.color;
        painter->setPen(color.darker(200));
        painter->setBrush(color.darker(200));
        foreach (qreal angle ,rdata.transitiondatmap.keys())
        {
            qreal length = step*rdata.transitiondatmap.value(angle);
            angle+=90; //因为转90
            QPointF certp(w/2 + length*qCos(angle*PI/180),h/2 - length*qSin(angle*PI/180));
            painter->drawEllipse(certp,2,2);

 
        }
    }

 
    painter->restore();
}

 
void CRadarDlg::drawLinePoints( QPainter *painter )
{
    painter->save();

 
    int w = width();
    int h = height();
    //    int count = 360/m_lineangle;
    int radius = qMin(w,h)/2*m_cylindernum/(m_cylindernum+1);
    //    qDebug()<<"info ----radius="<<radius;

 
    QList<int> keyilist = m_datamap.keys();

 
    qreal step = 1.0*radius/(m_Axis_max-m_Axis_min);
    //    qDebug()<<"info ----step="<<step;

 
    foreach (qreal key, keyilist)
    {
        RadarData rdata = m_datamap.value(key);
        QPainterPath path;
        int  i = 0;
        QPointF startp;

 
        QColor color = rdata.color;
        painter->setPen(color.darker(200));
        //        painter->setBrush(color.darker(200));
        foreach (qreal angle ,rdata.transitiondatmap.keys())
        {
            qreal length = step*rdata.transitiondatmap.value(angle);
            //            qDebug()<<"info ----length="<<length;
            angle+=90; //因为转90
            QPointF certp(w/2 + length*qCos(angle*PI/180),h/2 - length*qSin(angle*PI/180));
            //            painter->drawEllipse(certp,0,0);

 
            qDebug()<<"info ----certp="<<certp;
            if (i == 0)
            {
                path.moveTo(certp);
                startp = certp;
                //                qDebug()<<"info ----startp1="<<startp;
            }
            else
                path.lineTo(certp);
            ++i;
        }
        path.lineTo(startp);
        //        qDebug()<<"info ----startp2="<<startp;
        //        painter->setBrush(color.lighter(100));
        painter->drawPath(path);
    }

 

 
    painter->restore();
}

 
Qt 雷达图 一、可借鉴的例子 Qt 雷达模拟仿真工具(雨田哥作品) Qt绘制雷达图(效果图) Qt5–雷达图 Qt 实现雷达图 阅读详情

相关推荐

Qt下绘制PPI扫描的雷达图

简述 PPI扫描,即每次按一个仰角进行扫描,得到二维图像的方式。它的特点是来自不同距离的回波是离地面不同的高度上,扫描得到的数据在空间类似一个倒立圆锥的曲面表面。 Qt可以用OpenGL绘制复杂的图像,但为了简单和兼容性,这里介绍的是用Qt自己的绘图工具QPainter绘制PPI二维图像。 代码之路 ...

lusanshui的博客 5456

Qt编写雷达模拟仿真工具

雷达模拟仿真工具,主要通过模拟点模拟相关物体,方位、航向角、距离、速度,并且显示相关详情信息可建立跟踪线建立与模拟点联系。可自定义更换模拟点背景达到更加逼真效果,如歼击机,航母发射导弹效果,指挥所被打击爆炸效果。在距离上可自由控制距离缩放,也可建立危险等级制度的区域范围显示,也可激光雷达航向距离控制发射。这过程中会运用到很多数学计算,也有对模拟点组合效果。

项目开发/项目维护/项目指导 3671

Qt--paintEvent绘制雷达扫描图

新建一个Qt的窗口类,默认命名: class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); QPixmap paintWidget(); protected: void paintEvent(QPaintEvent...

sinan1995的博客 7829

Qt/QCustomPlot实现雷达PPI显示效果

使用Qt+QCustomPlot实现的雷达PPI显示效果图,支持设置颜色,扫描速度,扫描范围,更新数据等

【星天阁】 3876

Qt绘制雷达图(附完整源码)

Qt绘制雷达图(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1108

Qt绘制雷达图示例(C++)

首先,我们定义了雷达图的参数,包括中心点坐标、半径、维度和数据值。最后,我们绘制雷达图的数据区域,通过绘制线或面积来表示数据值。然后,我们使用QPainter在窗口上绘制雷达图的轴线、标签和数据区域。在这个示例中,我们创建了一个大小为400x400的窗口,并将雷达图部件添加到窗口中显示。编译并运行这个程序,你将看到一个简单的雷达图显示在窗口中,其中轴线和标签表示各个维度,数据区域表示数据值。编译并运行这个程序,你将看到一个简单的雷达图显示在窗口中,其中轴线和标签表示各个维度,数据区域表示数据值。

TechPr的博客 1050

wepy绘制雷达图

代码如下: <style lang='less'> .radar-canvas2 { width: 690rpx; height: 420rpx; } </style> <template> <canvas class='radar-canvas2' canvas-id='radar-canvas'>&...

weixin_30298497的博客 110

Qt数据可视化(QPolarChart雷达图)

雷达效果如下。定时移动线条位置。

啊渊的专栏 5832

QT实现雷达图和摇杆图

介绍一下代码吧,按照图上的顺序,先介绍这个摇杆图://三点坐标 QPolygonF triangle2;//三点坐标 QPolygonF triangle3;//三点坐标 QPolygonF triangle4;//三点坐标 path . addPolygon(triangle);//画三角形 painter . restore();int r = 15;if(!

turbolove的博客 1829

Qt散点图、折线图、柱状图、盒须图、饼状图、雷达图开发实例

Qt散点图、折线图、柱状图、盒须图、饼状图、雷达图开发实例。在开发过程中我们会使用多各种各样的图,讲数据进行可视化。我们可以使用以上几种图来表达我们的数据。Qt提供了一些可视化图的库Qchart,我们可以利用他开发自己想要图表。

啊渊的专栏 7844

基于Qt的简易雷达图绘制实现

Qt 提供了强大的图形绘制能力,主要通过QWidget和QPainter类实现。QWidget是所有用户界面对象的基类,而QPainter则负责在界面或图像上进行像素级的绘图操作。绘图通常由事件驱动,确保在窗口重绘时能动态更新图形内容。雷达图作为一种多维数据可视化形式,在 Qt 中可通过极坐标转换与路径绘制实现。其核心包括:绘制背景网格、角度线、刻度标签以及动态数据点的渲染。本章将为后续章节的实现打下坚实基础。当创建一个自定义控件时,通常需要继承QWidget。

weixin_28809949的博客 743

QT下的雷达扫描图

QT下的雷达扫描图 【下载地址】QT下的雷达扫描图 本仓库提供了一个使用Qt框架实现的简单雷达扫描图示例。这个项目展示了如何利用QTimer进行定时更新,paintEvent事件处理绘图逻辑,以及应用渐变填充效果来增强视觉体验。对于想要在Qt应用程序中集成动态雷达扫描图功能的开发者来说,是一个非常实用的参考资源 ...

gitblog_09747的博客 840

RadarDataDisp.rar_雷达 p 型显示_雷达A显和B显_雷达a显_雷达e显_雷达p显示

雷达数据显示与分析,包括雷达P显和E显两种方式,同时还可设置雷达量程、指定目标航迹数据显示等,该代码实用,值得参考。

Qt绘制雷达图(效果图)

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

好儿郎~志在四方 2万+

gd32 spi 发送&中断接收例程

【代码】gd32 spi 发送&中断接收例程。

weixin_43026921的博客 1653

Flink CDC 3.0 详解

Flink CDC 是基于数据库日志 CDC(Change Data Capture)技术的实时数据集成框架,支持全增量一体化、无锁读取、并行读取、表结构变更自动同步、分布式架构等高级特性。配合Flink 优秀的管道能力和丰富的上下游生态,Flink CDC 可以高效实现海量数据的实时集成。Flink CDC 于2023年12月7日重磅推出其全新的 3.0 版本,3.0版本的发布对 Flink CDC 而言具有里程碑的意义,自此 Flink CDC 从捕获数据变更的Flink 数据源正式迈向为以 Flink

奔跑的蜗牛的博客 2639

QT实现雷达图

修改数据结构以支持多组数据,使用不同颜色绘制多个多边形。角度从顶部开始(-π/2),按等分角度分布。继承自 QWidget,负责绘制雷达图。数据值归一化到 0~1 范围。方法用于设置数据和标签。:绘制同心圆网格和轴线。:绘制数据多边形和顶点。:在轴线末端绘制标签。

深之JohnChen的专栏 1372

【代码版本管理】SVN(Subversion)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对SVN(Subversion)代码版本管理做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 668

Qt 实现雷达图

利用 QPainter实现雷达图(玫瑰图)。效果如下: 源码如下 .h文件#ifndef CRADARDLG_H #define CRADARDLG_H#include <QWidget> #include <QPainter> #include <QPainterPath> #include <QMap> #include "qmath.h"enum RadarType { Rada

缘如风的博客 1万+

【数据集】未来不同情景下预测数据:如人口、土地利用等

未来不同情景下预测数据:如人口、土地利用等

WW、forever的博客 2995

USLE模型(1.2):LS因子的计算

基于USLE的甘南川西北土壤侵蚀研究。准备好30米分辨率的dem。

所有专家都曾始于新手 3481

QT 绘制雷达图

RadarWidget.h #pragma once #include <QWidget> #include "ui_RadarWidget.h" #include <QPainter> #include <QPaintEvent> #include <QTimerEvent> #include <QRect> #include <QMouseEvent> #include <iostream> #include &l

weixin_47729470的博客 3225

Transformer时间序列预测-多变量输入-单变量输出+多变量输出,完整代码数据,可直接运行

Transformer时间序列预测-多变量输入-单变量输出+多变量输出,完整代码数据,可直接运行

9794

Qt/C++源码/雷达模拟仿真工具/雷达频谱/信息采集/危险等级/雷达图/雷达地图

1. 设计点由背景,功能按钮,雷达区域,频谱区域,缩放模块,信息点采集模块组成; 2. 背景采用分层绘制达到绘制性能的最优化; 3. 功能按钮增设了相关雷达功能点; 4. 雷达区域为核心模块,包含模拟点各种功能效果,危险等级区域绘制,激光雷达等功能; 5. 频谱区域主要显示音频频谱效果; 6. 缩放模块控制雷达区域缩放效果; 7. 信息采集区域采集雷达区域相关数据信息点数据展示;

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 1万+

【Matlab算法】MATLAB实现的语音信号降噪算法(附MATLAB完整代码)

语音信号降噪是语音处理领域中的一个关键问题。在实际应用中,语音信号常常被各种环境噪声污染,这不仅影响了语音的质量,还可能导致后续处理(如语音识别)的性能下降。因此,开发有效的降噪算法对于提高语音通信质量、改善语音识别系统性能等具有重要意义。 本文将介绍并实现两种经典的语音信号降噪算法:谱减法和维纳滤波。这两种方法都是基于频域处理的技术,具有实现简单、计算效率高的特点。通过MATLAB实现这些算法,我们可以直观地比较它们的性能和降噪效果。

Albert_Lsk的博客 1329

CoppeliaSim和Python进行无人机联合仿真

CopeeliaSim和Python进行无人机轨迹跟踪联合仿真。首先建立起CoppeliaSim和Python的连接,其次在Python中生成轨迹,CoppeliaSim仿真环境中的无人机进行跟踪,并绘制出轨迹曲线,有每一步详细的教学。

加斯顿工程师的博客 987
上一篇: qt文件复制不成功问题
下一篇: java runtime exec 执行shell脚本 无效问题
魑-魅-魍-魉
博客等级 码龄13年 3粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值