前言

关于雷达样式可参考文章:https://blog.csdn.net/Aidam_Bo/article/details/84260883


一、代码

头文件.h

#ifndef RADARSCAN_H
#define RADARSCAN_H#include <QtWidgets/QWidget>
#include "ui_radarscan.h"class RadarScan : public QWidget
{Q_OBJECTpublic:RadarScan(QWidget *parent = 0);~RadarScan();QPixmap paintWidget();protected:void paintEvent(QPaintEvent *event);void resizeEvent(QResizeEvent *event);protected slots:void timerTimeOut();private:QTimer *timer;QPoint point;int i_diameter = 0;double d_angle = 0;QList<QPixmap> list_pixmap;private:Ui::RadarScanClass ui;
};#endif // RADARSCAN_H

实现.cpp

#include "radarscan.h"
#include <QPainter>
#include <QPen>
#include <QDebug>
#include <QLinearGradient>
#include <QTimer>
#include <QTime>RadarScan::RadarScan(QWidget *parent): QWidget(parent)
{ui.setupUi(this);this->setStyleSheet("background-color:black");//设置窗口背景色为黑色timer = new QTimer();connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeOut()));timer->start(10);
}RadarScan::~RadarScan()
{}
void RadarScan::resizeEvent(QResizeEvent *event)
{if (this->width() > this->height()){point = QPoint((this->width() - this->height()) / 2 + (this->height() - 12) / 2, this->height() / 2);i_diameter = this->height() - 12;}else{point = QPoint(this->width() / 2, (this->height() - this->width()) / 2 + (this->width() - 12) / 2);i_diameter = this->width() - 12;}
}void RadarScan::timerTimeOut()
{timer->start(10);d_angle += 3.14 / 720;if (d_angle >= 6.28){d_angle = 0;}update();}void RadarScan::paintEvent(QPaintEvent *event)
{QPainter p_painter(this);//反锯齿p_painter.setRenderHint(QPainter::Antialiasing);p_painter.drawPixmap(0, 0, this->width(), this->height(), paintWidget());QWidget::paintEvent(event);
}QPixmap RadarScan::paintWidget()
{QPixmap pixmap(this->width(), this->height());QPainter p_painter(&pixmap);QPen pen;QTime timedebug;timedebug.start();//反锯齿p_painter.setRenderHint(QPainter::Antialiasing);pixmap.fill(Qt::black);pen.setColor(Qt::green);p_painter.setPen(pen);pen.setColor(Qt::gray);p_painter.setPen(pen);p_painter.drawLine(point.x(), point.y() - i_diameter / 2 - 10, point.x(), point.y() + i_diameter / 2 + 10);//画坐标p_painter.drawLine(point.x() - i_diameter / 2 - 10, point.y(), point.x() + i_diameter / 2 + 10, point.y());pen.setColor(Qt::green);p_painter.setPen(pen);for (int i = 0; i<6; i++){p_painter.drawEllipse(point.x() - i_diameter*0.2*i / 2, point.y() - i_diameter*0.2*i / 2, i_diameter*0.2*i, i_diameter*0.2*i);}QConicalGradient conical_gradient(point, (6.28 - d_angle) / 6.28 * 720);//定义圆心和渐变的角度conical_gradient.setColorAt(0, Qt::green);conical_gradient.setColorAt(0.2, QColor(255, 255, 255, 0));p_painter.setBrush(conical_gradient);p_painter.drawEllipse(point.x() - i_diameter / 2, point.y() - i_diameter / 2, i_diameter, i_diameter);qDebug() << "time_end=" << timedebug.elapsed() << "ms";return pixmap;}

二、细节实现

(1)重写resizeEvent函数,当窗口缩放时,对绘图的大小也进行缩放:

void RadarScan::resizeEvent(QResizeEvent *event)
{if(this->width() > this->height()){point = QPoint((this->width()-this->height())/2+(this->height()-12)/2,this->height()/2);i_diameter = this->height()-12;}else{point = QPoint(this->width()/2,(this->height()-this->width())/2+(this->width()-12)/2);i_diameter = this->width()-12;}
}

(2)在绘图函数中主要使用了QPixmap的定义画布,QPEN定义画笔,QConicalGradient对图形进行渐变填充,drawEllipse进行画圆:

QPixmap Widget::paintWidget()
{QPixmap pixmap(this->width(),this->height());QPainter p_painter(&pixmap);QPen pen;QTime timedebug;timedebug.start();//反锯齿p_painter.setRenderHint(QPainter::Antialiasing);pixmap.fill(Qt::black);pen.setColor(Qt::green);p_painter.setPen(pen);pen.setColor(Qt::gray);p_painter.setPen(pen);p_painter.drawLine(point.x(),point.y()-i_diameter/2-10,point.x(),point.y()+i_diameter/2+10);//画坐标p_painter.drawLine(point.x()-i_diameter/2-10,point.y(),point.x()+i_diameter/2+10,point.y());pen.setColor(Qt::green);p_painter.setPen(pen);for(int i=0; i<6; i++){p_painter.drawEllipse(point.x()-i_diameter*0.2*i/2,point.y()-i_diameter*0.2*i/2,i_diameter*0.2*i,i_diameter*0.2*i);}QConicalGradient conical_gradient(point,(6.28-d_angle)/6.28*720);//定义圆心和渐变的角度conical_gradient.setColorAt(0,Qt::green);conical_gradient.setColorAt(0.2,QColor(255,255,255,0));p_painter.setBrush(conical_gradient);p_painter.drawEllipse(point.x()-i_diameter/2,point.y()-i_diameter/2,i_diameter,i_diameter);qDebug()<<"time_end="<<timedebug.elapsed()<<"ms";return pixmap;}

(3)QTimer定义定时器连接槽函数,当定时溢出时对图像进行刷新,同时重新开启定时,定时单位是毫秒:

void Widget::timerTimeOut()
{timer->start(10);d_angle += 3.14/720;if(d_angle >= 6.28){d_angle = 0;}update();}

(4)最后对paintEven进行重构:

void Widget::paintEvent(QPaintEvent *event)
{QPainter p_painter(this);//反锯齿p_painter.setRenderHint(QPainter::Antialiasing);p_painter.drawPixmap(0,0,this->width(),this->height(),paintWidget());QWidget::paintEvent(event);
}

三、效果展示

(1)得到的一直在扫描的图像:

(2)打印记录时间:


总结

源码:

代码资源下载:https://download.csdn.net/download/aidam_bo/10878728(paintEven绘图)

改善:

因为图像会随着窗口的拉伸而变大,当图像变得比较大时,绘图的时间就会变的比较长,图像越大绘图时间越长,看着图像的移动比较缓慢。目前暂时想到了几种简单的思路:

1,使用图片:paintEvent只绘制坐标,扫描的动画使用图片的格式来实现,对图片不断进行旋转,这种方法对图片的透明度有要求。

2,使用多线程:使用多线程同时绘制多个图形,使用信号量对图形进行读取显示。

3,改变渐变填充的区域:这里的渐变填充是填充了整个圆形区域,可以改变填充的区域,使用drawPie绘制扇形进行渐变填充。

4,使用Qt封装的openGL或者第三方库,例如:https://sourceforge.net/projects/qfi/ 这种(这是飞行仪表的开源库,代码很短)。

Qt总结之六:QPaintEvent绘制雷达图相关推荐

  1. Qt总结之七:QPaintEvent绘制雷达图(二)

    前言 这里使用另一套框架写的雷达扫描图 这里PaintEvent事件比上一个版本写的好,但是不喜欢Widget嵌套的方式,后续会把两个版本整合到一起. 一.实现原理 雷达效果包括三个部分:背景.转动的 ...

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

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

  3. Qt OpenGL(三十六)——Qt OpenGL 核心模式-绘制雷达坐标系

    提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 Qt OpenGL(三十六)--Qt OpenGL 核心模式-绘制雷达坐标系 一.场景 ...

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

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

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

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

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

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

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

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

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

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

  9. python画出的雷达图效果-PYTHON绘制雷达图代码实例

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

最新文章

  1. spring in action 4 线路图
  2. java删除指定目录下文件_Java中循环删除指定目录下的文件
  3. [原创]全球首款不使用ViewState的Asp.Net2.0控件库
  4. 海康8700等联网网关通过GB28181接入LiveGBS流媒体服务实现web端无插件直播
  5. android framework项目开发案例-动态隐藏Launcher上图标
  6. 数据分析有 AI 帮你,Sugar BI 智能分析全场景介绍
  7. 让计算机u盘启动,U盘启动设置|电脑如何设置U盘启动?
  8. 计算机网络——ALOHA协议
  9. (二十一)资产(组合)的预期收益率和风险
  10. windows下开源免费waf防火墙,附可用资源包
  11. 差分方程MATLAB求冲激响应,用matlab求解某已知的差分方程的单位冲激响应全过程...
  12. hp,Qlogic,Brocade光纖卡查看方式
  13. 天猫四大独门利器,助力品牌引领消费趋势
  14. 读“王东升 新时空 硅碳融合的产业革命”拙见
  15. ESP-IDF遇到的关于环境变量的问题
  16. 7、Spring AOP使用
  17. 人工客服 计算机英语怎么说,人工服务用英文怎么说? 电话上的。。。谢谢
  18. vue echarts 水球图 多个水球图并存配置
  19. Centos7安装cairo-dock
  20. 玩转控件:Fucking ERP之流程图

热门文章

  1. CSS3动画框架 Animate.css
  2. 大一java怎么学好_是否应该学习第二门语言,学那个比较合适。
  3. Jquery获取iframe中的元素
  4. html 英文字母不换行,css如何设置英文单词不换行?
  5. adaptec SCSI卡管理和配置选项
  6. OpenSSL版本号
  7. Windows10 tpm.msc 管理程序
  8. 如何有效使用Project
  9. 与Xcode相比Adobe AIR开发iOS的优势和局限
  10. linux centos网卡配置,centos网卡配置详解