基于Qt的雷达航迹控件(解决QWidget绘制多点卡顿问题)

:详细讲解

在本篇文章中,我们将详细探讨如何使用Qt创建一个雷达轨迹系统。该系统可以模拟雷达轨迹的显示、处理用户的交互并管理轨迹选中状态。通过这篇文章,您将了解到自定义类 RadarTrackItemRadarTrackManagerOverlayWidgetRadarGridItem 的实现细节以及它们之间的协作方式。

在这里插入图片描述

1. 核心概念与组件概述

在这个雷达系统中,我们通过多个自定义类来实现不同的功能,这些类主要有:

  • RadarTrackItem:表示单个雷达轨迹,包含轨迹点、标签和选中状态的处理。
  • RadarTrackManager:管理所有的雷达轨迹,负责控制轨迹的选中状态,确保一次只有一个轨迹被选中。
  • RadarGridItem:绘制雷达的网格和扫描效果,作为背景显示在场景中。
  • OverlayWidget:叠加信息显示小部件,用于在界面上展示雷达的当前状态、系统时间等。

这些类的组合构成了一个完整的雷达轨迹系统。接下来,我们将逐一解释每个类的实现及其关键功能。


2. RadarTrackItem:雷达轨迹的实现

RadarTrackItem 是核心类之一,它用于表示和绘制单个雷达轨迹。每个 RadarTrackItem 包含以下功能:

  • 轨迹点的绘制:每个雷达轨迹由一系列坐标点组成,这些点会以小圆点的形式显示在界面上。
  • 标签显示:轨迹上会显示一个标签,表示该轨迹的名称。标签会自动跟随最新的轨迹点。
  • 选中状态的处理:轨迹可以被选中或取消选中,并且在选中时轨迹的颜色会发生变化。

代码实现如下:

// RadarTrackItem 构造函数
RadarTrackItem::RadarTrackItem(const QString &label, const QList<QPointF> &points, QGraphicsItem *parent): QObject(), QGraphicsItem(parent), trackPoints(points), labelName(label), trackColor(Qt::yellow), labelColor(Qt::white), selectedState(false)
{// 创建航迹标签,使用自定义的 CustomTextItemtrackLabel = new CustomTextItem(label, this);  trackLabel->setLabelFontSize(4);  trackLabel->setLabelColor(labelColor);  trackLabel->setPos(points.last().x(), points.last().y());// 设置该图元为可选中状态setFlag(QGraphicsItem::ItemIsSelectable);  // 初始化时取消选中状态setSelectedState(false);// 注册到轨迹管理器RadarTrackManager::instance()->registerTrack(this);// 设置图元的缓存模式,以提高性能this->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
}// 处理标签的选中状态
void RadarTrackItem::handleSelectionChanged(bool selected)
{if (selected) {// 通知管理器取消其他航迹的选中状态RadarTrackManager::instance()->trackSelected(this);}setSelectedState(selected);  
}// 绘制轨迹点和标签
void RadarTrackItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{qreal pointSize = 0.1;  painter->setPen(Qt::NoPen);  painter->setBrush(QBrush(trackColor));// 绘制轨迹点for (const QPointF &point : trackPoints) {painter->drawEllipse(point, pointSize, pointSize);}// 更新标签位置if (!trackPoints.isEmpty()) {trackLabel->setPos(trackPoints.last().x() + 1, trackPoints.last().y() - 1);}
}

该类的关键部分在于它如何处理轨迹点的绘制和轨迹标签的同步更新。通过 setSelectedState 函数,我们可以改变轨迹的选中状态,并通知管理器更新其他轨迹的状态。


3. RadarTrackManager:轨迹管理器

RadarTrackManager 负责管理所有的轨迹,并确保同时只有一个轨迹处于选中状态。它是一个单例类,保证全局只有一个实例用于管理所有轨迹。

关键功能如下:

  • 轨迹的注册:每个 RadarTrackItem 创建时都会注册到管理器中,以便统一管理。
  • 轨迹选中状态的管理:当某个轨迹被选中时,其他所有轨迹都会被取消选中,保证系统中只有一个轨迹是被选中的。

代码如下:

// 单例模式实现
RadarTrackManager* RadarTrackManager::instance()
{static RadarTrackManager manager;  return &manager;  
}// 注册航迹
void RadarTrackManager::registerTrack(RadarTrackItem* track)
{tracks.append(track);
}// 处理航迹的选中状态
void RadarTrackManager::trackSelected(RadarTrackItem* selectedTrack)
{QList<RadarTrackItem*> tracksToDeselect;// 遍历所有已注册的航迹,如果不是当前选中的航迹且已选中,则取消选中for (RadarTrackItem* track : tracks) {if (track != selectedTrack && track->isSelected()) {tracksToDeselect.append(track); }}// 取消其他航迹的选中状态for (RadarTrackItem* track : tracksToDeselect) {track->setSelectedState(false);}
}

通过该管理器,系统确保了轨迹的选中逻辑简单明了,避免了多轨迹同时选中的混乱。


4. RadarGridItem:绘制雷达网格与扫描效果

RadarGridItem 类用于绘制雷达背景的网格及模拟雷达的扫描效果。该类会定时更新扫描角度,并使用渐变色来模拟雷达扫描线的移动。

主要功能如下:

  • 同心圆和径向线的绘制:雷达背景由多个同心圆和径向线组成,形成雷达网格。
  • 雷达扫描效果:通过使用 QConicalGradient 来创建雷达扫描的视觉效果,模拟雷达扫描线的旋转。

代码实现:

void RadarGridItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{qreal scale = painter->worldTransform().m11();  qreal adjustedScale = qMax(scale, 0.1);  qreal penWidth = qMax(1.0 / adjustedScale, 0.5);  QPen gridPen(Qt::green);gridPen.setWidthF(penWidth);painter->setPen(gridPen);// 绘制同心圆for (int i = 50; i <= 200; i += 50) {painter->drawEllipse(QPointF(0, 0), i, i);}// 绘制径向线for (int angle = 0; angle < 360; angle += 30) {QLineF line(QPointF(0, 0), QPointF(200 * qCos(qDegreesToRadians(angle)),200 * qSin(qDegreesToRadians(angle))));painter->drawLine(line);}// 绘制雷达扫描的渐变区域QConicalGradient gradient(center, -angle * 180.0 / PI);gradient.setColorAt(0.0, QColor(0, 255, 0, 180));  gradient.setColorAt(1.0, Qt::transparent);  painter->setBrush(gradient);// 绘制扫描区域painter->drawPie(center.x() - radius, center.y() - radius, radius * 2, radius * 2,int(-angle * 180.0 / PI * 16), 30 * 16);  
}

该类的绘制逻辑主要依赖于Qt的绘图系统,通过精确控制角度与渐变,可以生成动态的雷达扫描效果。


5. OverlayWidget:显示雷达信息

OverlayWidget 类用于显示雷达系统中的各种实时信息,例如雷达的经纬度、当前系统时间、工作时长等。这些信息会被叠加到场景中,但不会干扰用户的操作。

代码实现:

void OverlayWidget::paintEvent(QPaintEvent *)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);// 绘制左上角的雷达信息painter.setPen(Qt::green);painter.drawText(10, 20, tc("雷达经度: 109°09'59.71\""));painter.drawText(10, 40, tc("雷达纬度: 34°04'55.28\""));painter.drawText(10, 60, tc("雷达高度: 588 米"));// 绘制右下角的系统时间信息painter.setPen(Qt::red);painter.drawText(width() - 160, height() - 60, tc("系统日期: %1").arg(QDate::currentDate().toString("yyyy-MM-dd")));painter.drawText(width() - 160, height() - 40, tc("系统时间: %1").arg(QDateTime::currentDateTime().toString("hh:mm:ss")));
}

6. 总结:将所有组件整合

通过这些自定义类的协作,系统可以:

  • 绘制雷达背景和网格;
  • 显示雷达扫描的动态效果;
  • 管理和显示多个雷达轨迹;
  • 处理用户与轨迹的交互,并通过 RadarTrackManager 统一管理轨迹的选中状态。

该系统展示了如何使用Qt的图形框架和自定义控件实现复杂的场景管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/57037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据-180 Elasticsearch - 原理剖析 索引写入与近实时搜索

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

美摄科技云服务解决方案,方案成熟,接入简单

美摄科技作为视频处理领域的先锋&#xff0c;凭借其强大的技术实力和深厚的行业经验&#xff0c;推出了成熟的云服务解决方案&#xff0c;为轻量化视频制作开辟了全新的道路。 一、成熟方案&#xff0c;接入无忧 美摄科技云服务解决方案的最大亮点在于其成熟度和易用性。我们…

Vulnhub打靶-matrix-breakout-2-morpheus

基本信息 靶机下载&#xff1a;https://pan.baidu.com/s/1kz6ei5hNomFK44p1QT0xzQ?pwdy5qh 提取码: y5qh 攻击机器&#xff1a;192.168.20.128&#xff08;Windows操作系统&#xff09; 靶机&#xff1a;192.168.20.0/24 目标&#xff1a;获取2个flagroot权限 具体流程 …

前端 js 处理一个数组 展示成层级下拉样式

好记性不如赖笔头&#xff1b; 前端开发中&#xff0c;不管是什么时候都会遇到select 下拉框的使用&#xff0c;一般情况下&#xff0c;数据处理后端都会处理好。前端一般使用相应技术栈所推荐的公共组件就可以了。 但是一般也有后端不处理的数组&#xff0c;需要前端自己处理成…

【热门主题】000007 网络安全:守护数字世界的坚固防线

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热门主题】000007 网络安全&#xff1a;守护数字世界的坚固防线一、网…

精准赋能,助力成长 | 亲笔签数字科技“笔迹大计”第一期培训圆满收官

创新驱动&#xff0c;合作共赢。近日&#xff0c;亲笔签数字科技成功举办第一期“笔迹大计”专业培训&#xff0c;为新入职渠道管理员工和新签约渠道伙伴精准赋能&#xff0c;进一步提升业务能力水平。 精心筹备&#xff0c;全面覆盖 本期“笔迹大计”培训内容全面&#xff0c…

当LangGraph遇上Mem0:如何让你的AI Agent具有更智能的记忆与个性化的体验?

AI Agent&#xff08;智能体&#xff09;的记忆&#xff08;Memory&#xff09;被认为是一项必备的基础能力&#xff0c;它用来提取、存储会话中的重要信息并用于后续的检索与使用。可以把记忆简单地分成短期记忆与长期记忆两种&#xff0c;用来“记住”不同类型的信息&#xf…

Navicat连接openGauss数据库详细指南

文章目录 环境准备总体的技术路线root权限下&#xff0c;防火墙的关闭切换用户修改文件修改文件pg_hba.conf修改文件postgresql.conf重启数据库 创建用于连接的数据库和数据库用户使用Navicat连接 资料参考 环境准备 自行安装Navicat连接工具(自己找破解版)已经安装好openGaus…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款购物类智能体的开发,来体验一下我的智能体『科技君Tom』

目录 1.1、智能体运行效果1.2、创作灵感来源智能体平台拥有个人化且人性化的大致框架&#xff0c;可以让小白也能搭建出一个智能体其次是拥有丰富的插件&#xff0c;可以更加快速的得到自己想要的效果~ 1.3、如何制作智能体常见问题与解决方案关于人设与回复逻辑插件使用模型的…

【Linux内核】eBPF基础篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了学习ebpf机制的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于–知乎ebpf专栏文章–进行的&#xff0c;每个知识点的修正和深…

python获取当前鼠标位置的RGB值

效果 依赖 pip install Pillow pyautoguisudo apt install gnome-screenshot代码 import pyautogui import timedef get_rgb_at_mouse():try:while True:# 获取当前鼠标的位置x, y pyautogui.position()# 截取当前屏幕图像screenshot pyautogui.screenshot()# 获取鼠标位置…

小O睡眠省电调研

摘要 AI 预测睡眠 断网 杀应用为主的策略 UI 睡眠识别 AI 识别 将亮灭屏、音频、上传下载、运动状态数据存到xml中&#xff0c;供预测分析 睡眠策略 OPPO 睡眠省电 1. sOSysNetControlManagerNewInstance&#xff1a;断网&#xff08;wifi\mobiledata&#xff09;2. S…

【D3.js in Action 3 精译_036】4.1 DIY 实战:在 Observable 平台实现 D3折线图坐标轴的绘制

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

百度统计提示:为了满足法律法规最新规定和要求,您的网站由于存在合规风险将被暂停使用百度统计服务

今天打开百度统计后看到提示&#xff1a; 为了满足法律法规及政府监管的最新规定和要求&#xff0c;保护广大网民的合法权益&#xff0c;您的网站由于存在合规风险将被暂停使用百度统计服务。 请您在10日内完成整改&#xff0c;否则将删除违规站点及数据&#xff0c;有问题可发…

使用dotnet-counters和dotnet-dump 分析.NET Core 项目内存占用问题

在.NET Core 项目部署后&#xff0c;我们往往会遇到内存占用越来越高的问题&#xff0c;但是由于项目部署在Linux上&#xff0c;因此无法使用VS的远程调试工具来排查内存占用问题。那么这篇文章我们大家一起来学习一下如何排查内存占用问题。 首先&#xff0c;我们来看一下应用…

手机数据恢复技巧:适用于手机的恢复应用程序

发现自己意外删除了 Android 设备上的照片&#xff0c;这让人很痛苦。这些照片可能是值得纪念的文件&#xff0c;会让您想起一些难忘的回忆。删除它们后&#xff0c;您知道如何恢复它们。在这种情况下&#xff0c;您需要使用 Android 的照片恢复应用程序。 无论您需要直接从 A…

【控制系统】深入理解反步控制(Backstepping) | 反步法控制器原理与应用实例解析(附Matlab/Simulink仿真实现)

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…

使用Airtest自动化某云音乐爬取歌曲名称

简介 本文将介绍如何使用Airtest自动化工具来模拟用户操作&#xff0c;从某云音乐中爬取与特定关键词相关的歌曲名称。我们将以搜索“文字”相关的歌曲为例&#xff0c;并将结果保存到本地文件。 准备工作 安装Airtest并配置好Android设备或模拟器。确保你的设备上已安装某云…

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】 导语 在Java高级编程的世界里,设计模式是每个开发者必须掌握的利器。但是,如何快速理解并灵活运用这些模式呢?让我们一起探索如何借助AI编程助手Cursor,轻松掌握设计模式,提升Java编程技能! 正文 设计模式:J…

QUIC(Quick UDP Internet Connections)与 RTMP(Real Time Messaging Protocol)

QUIC&#xff08;Quick UDP Internet Connections&#xff09;和 RTMP&#xff08;Real Time Messaging Protocol&#xff09;是两种不同的网络传输协议&#xff0c;它们在一些方面有不同的特点和应用场景。 QUIC 协议 特点 基于 UDP&#xff1a;QUIC 建立在 UDP 之上&#xff…