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

最新文章

  1. [TCPIP] 分层 Note
  2. SpringMVC接收页面表单参数
  3. mac 启动apache + php
  4. 评估Divide and Conquer算法时间复杂度的几种策略
  5. 【转】Android开发调试工具ADB的使用
  6. PLSQL Developer安装(Oracle11g+win7_64bit)
  7. hdu1087 简单DP
  8. 解决cognos以远程db2数据库为数据源的连接失败问题
  9. Ubuntu切换至root用户
  10. SQL server 和Oracle 序列
  11. 在地图中使用Java
  12. hdu 2444
  13. 在ubuntu系统中给filezilla创建桌面快捷方式
  14. cdh版本的hue安装配置部署以及集成hadoop hbase hive mysql等权威指南
  15. 关于Java中的Null
  16. Day12 前端html
  17. 将.rpm转换为.tar.gz
  18. 1.准备工作之Groovy
  19. 【效率工具】史上最好用的SSH一键登录脚本,第三版更新!
  20. Opening Ceremony(贪心)

热门文章

  1. day35 作业
  2. 你是如何理解Vue的响应式系统的
  3. 爬虫03 /代理、cookie处理、模拟登录、提升爬虫效率
  4. C#-CLR note - 26线程
  5. CSS定位布局
  6. 查看进程中占cpu高的线程方法
  7. ES6语法——let和const
  8. JQuery对下拉列表Select的一些操作
  9. 题解 洛谷 P3825 【[NOI2017]游戏】
  10. java计算下一个整5分钟时间点