1、设计思想

雷达扫描图,在影视作品中见到较多,比如飞机雷达、舰艇雷达,有一个扫描线转圈代表雷达一周旋转或一个批次的收发,发现目标就在表盘上标记位置。和汽车仪表盘类似,汽车仪表盘有底盘背景图、同圆、刻度、刻度值、旋转的指针。能在汽车仪表盘的基础上略作修改,比如指针换成带有余辉的扫描扇面,就能完成一个雷达扫描图。

代码实现原理:
上图的扫描线和余辉效果,可以使用QConicalGradient 函数来实现,qconicalgradient()提供的是一种扇形渐变效果,圆锥式渐变或称角度渐变。用这个渐变色来填充drawPie函数就可以实现扇形选择的余辉。

QConicalGradient::QConicalGradient(qreal cx, qreal cy, qreal angle)

void QPainter::drawPie(const QRectF &rectangle, int startAngle, int spanAngle)

Qt大神刘典武文章中有典型的讲解,《Qt编写自定义控件62-探探雷达》中实现的扫描效果就是雷达的效果。详情移步https://zhuanlan.zhihu.com/p/85512788

2、代码实现

绘制同心圆,x和y轴实线,45度对角线虚线。

void Radar::drawCircle(QPainter *painter)
{
painter->save(); QColor color = QColor(, , );
QPen pen = QPen(color, );
painter->setPen(pen); for(int i=; i<; i++)
{
int r = this->radius / * (i+);
painter->drawEllipse(-r, -r, r * , r * );
} for(int i=; i<=; i++) // x,y 轴线是实线
{
int r = this->radius;
if((i%) == ) {
pen.setStyle(Qt::SolidLine);
}
else{
pen.setStyle(Qt::DashDotLine);
//pen.setDashPattern(QVector<qreal>() << 10 << 2 ); //实线:空线的比例
}
painter->setPen(pen);
painter->drawLine(-r, , r, );
painter->rotate(/);
} painter->restore();
}

绘制扫描图,依靠锥形渐变颜色,通过透明度控制形成扫描效果,然后绘制饼图。

void Radar::drawScan(QPainter *painter)
{
painter->save(); //锥形渐变颜色,通过透明度控制形成扫描效果
QConicalGradient conicalGradient(, , this->angle);
QColor color = QColor(,,);
color.setAlpha();
conicalGradient.setColorAt(, color);
color.setAlpha();
conicalGradient.setColorAt(0.1, color);
color.setAlpha();
conicalGradient.setColorAt(, color); //绘制饼圆
QPen pen;
pen.setWidth();
pen.setBrush(conicalGradient);
painter->setPen(pen);
painter->setBrush(conicalGradient);
int r = this->radius;
QRect rect(-r, -r, r * , r * );
painter->drawPie(rect, this->angle * , * ); // 1/16th of a degree painter->restore();
}

给雷达加上模拟的扫描目标,实现起来很简单,就是打点。

void Radar::drawPoints(QPainter *painter)
{
painter->save(); QColor color = QColor(, , );
QPen pen = QPen(color, );
painter->setPen(pen);
painter->setBrush(color);
for(int i=; i<this->points.count(); i++)
{
int r = ;
QRect rect(points[i].x() - r/, points[i].y() - r/, r * , r * );
painter->drawEllipse(rect); // 1/16th of a degree
} painter->restore();
}

最终效果如下。

外层怎么 调用?使用信号和槽驱动Radar类对象。

RadarScan::RadarScan(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::RadarScan)
{
ui->setupUi(this); // start and stop
connect(this, &RadarScan::radar_state_changed,
ui->radar, &Radar::radar_start_control); connect(ui->startButton, &QPushButton::clicked, [=](){
emit radar_state_changed(true);
}); connect(ui->stopButton, &QPushButton::clicked, [=](){
emit radar_state_changed(false);
}); // speed control
connect(this, &RadarScan::radar_speed_changed,
ui->radar, &Radar::radar_speed_control); connect(ui->fastButton, &QPushButton::clicked, [=](){
emit radar_speed_changed(true);
}); connect(ui->slowButton, &QPushButton::clicked, [=](){
emit radar_speed_changed(false);
}); connect(ui->randomButton, &QPushButton::clicked, ui->radar, &Radar::radar_random_point);
}

3、效果演示

尊重技术文章,转载请注明!

Qt自定义控件之仪表盘2--QPaint绘制仪表盘

https://www.cnblogs.com/pingwen/p/13426304.html

Qt自定义控件之仪表盘3--雷达扫描图的更多相关文章

  1. Qt自定义控件之仪表盘2--QPaint绘制仪表盘

    0.前言 前面一篇文章写道了仪表盘的特点,实现了一个贴图的仪表盘,属于低配版本的仪表盘.    主要是有任何改动时候就需要重新设计图片,不能适配不同控件大小,即使让它自由拉伸,但仪表盘放大缩小时候显示 ...

  2. WPF 制作雷达扫描图

    实现一个雷达扫描图. 源代码在TK_King/雷达 (gitee.com),自行下载就好了 制作思路 绘制圆形(或者称之轮) 绘制分割线 绘制扫描范围 添加扫描点 具体实现 首先我们使用自定义的控件. ...

  3. Qt自定义控件之仪表盘1--简单的贴图仪表盘

    0.前言 学程序首先要输出hell world,学电子要先来个流水灯.学Qt,那就必须先来个自定义控件,若有人问我从哪个下手,我推荐仪表盘,可简可繁,从低配到高配齐全,可入门也可进阶. 1.仪表盘解析 ...

  4. Qt自定义控件大全(一)云台仪表盘控件

    做过安防视频监控的同学都清楚,在视频监控系统软件上都可以看到一个云台控制区域,可以对球机进行下下左右等八个方位的运动控制,还可以进行复位,一般都是美工作图好,然后贴图的形式加入到软件中,好处是程序简单 ...

  5. 编写Qt Designer自定义控件(一)——如何创建并使用Qt自定义控件

    在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等.虽然Qt Designer里的控件可以满足我们大部分的 ...

  6. Qt自定义控件(插件)并添加到QtDesigher

    之前使用Qt的时候都是手写代码的(因为批量按钮可以使用数组实现),但当界面越来越复杂时,这种开发效率就太低了; 后来就开始使用QtDesigner,但要使QtDesigner支持我自己写的控件,需要提 ...

  7. QT自定义控件插件化简要概述

    1.选择 "其他项目"->"Qt4 设计师自定义控件" **最好选中所有的编译器平台,由于目前使用的Qt Creator是MSVC2015 32位,因此要 ...

  8. Qt自定义控件

    Qt创建自定义控件教程 一.新建Qt设计师控件 二.设置项目名称 三.选择kits 这里取消Debug选项,不需要这个选项都是编译为dll文件直接调用. 删除掉MyControl原有的.h和cpp文件 ...

  9. QT自定义控件系列(二) --- Loading加载动画控件

    本系列主要使用Qt painter来实现一些基础控件.主要是对平时自行编写的一些自定义控件的总结. 为了简洁.低耦合,我们尽量不使用图片,qrc,ui等文件,而只使用c++的.h和.cpp文件. 由于 ...

随机推荐

  1. Aspose下载图片

    /// <summary> /// 把DataTable数据按照Excel模板导出到Excel /// </summary> /// <param name=" ...

  2. day55 js进阶

    目录 引子 一.BOM操作 1 window对象 2 window子对象 3 history对象 4 location对象(掌握) 5 弹出框 6 计时器相关 二.DOM操作 1 查找标签 1.1 直 ...

  3. java 面向对象(三十五):泛型在继承上的体现

    泛型在继承上的体现: /* 1. 泛型在继承方面的体现 虽然类A是类B的父类,但是G<A> 和G<B>二者不具备子父类关系,二者是并列关系. 补充:类A是类B的父类,A< ...

  4. mongodb(二):数据库安装,部署(linux)

    1.下载安装包 wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.2.tgz 下载完成后解压缩压缩包 tar zxf mongod ...

  5. 机器学习实战基础(二十五):sklearn中的降维算法PCA和SVD(六) 重要接口,参数和属性总结

    到现在,我们已经完成了对PCA的讲解.我们讲解了重要参数参数n_components,svd_solver,random_state,讲解了三个重要属性:components_, explained_ ...

  6. 爬虫黑科技,我是怎么爬取indeed的职位数据的

    最近在学习nodejs爬虫技术,学了request模块,所以想着写一个自己的爬虫项目,研究了半天,最后选定indeed作为目标网站,通过爬取indeed的职位数据,然后开发一个自己的职位搜索引擎,目前 ...

  7. JavaScript中的var,const,let区别与用法(浅谈)

    let 和 const是(ES6) 新增加了两个重要的 JavaScript 关键字. 1.var全局变量 //全局变量在 JavaScript 程序的任何地方都可以访问 //定义的变量可以修改,如果 ...

  8. 代码Verify简介

    序 对于开发者而言,编译代码和提交代码是必不可少的流程,同一个需求反复提交的情况也时常出现,那么怎么避免这种情况,且保证代码的质量,这就是Verify CI的目标.Verify表示认证验证的意思,结合 ...

  9. ElementUI 级联选择框 设置最后一级可选及相关问题解决

    在使用 elementUI 的 el-cascader 级联选择框进行省市联动效果时,有这么一个需求:该级联选择框一共有三级结构分别为国家-省份-城市,国家和省份为必选项,城市为可选项.具体实现如下: ...

  10. 异常类throwable

    一.Error 严重错误,系统内部的错误.无法通过处理,只能避免. 二.Exception 使用不当导致,是可以避免的. 异常分类: 1.编译时异常 编译时遇到的异常,若未处理,就会编译失败,必须进行 ...