Qt编写雷达模拟仿真工具2-自定义QGraphicsItem按钮

一、前言

雷达模拟仿真工具,整体结构采用的QGraphicsView框架,场景需要设计一个可点击的自定义按钮出来,在QGraphicsView中一切基础元素点都是基于QGraphicsItem,在QGraphicsItem类中我们可以看到它不继承自QObject,那意味着想要点击信号不可取,而Qt提供了QGraphicsObject类,可以看到它继承了QObject和QGraphicsItem,那么我们只需要自定义一个类继承QGraphicsObject即可完成我们需要的功能,核心部分看代码部分即可。

二、雷达模拟仿真工具介绍

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

三、功能特点

  1. 设计点由背景,功能按钮,雷达区域,频谱区域,缩放模块,信息点采集模块组成;
  2. 背景采用分层绘制达到绘制性能的最优化;
  3. 功能按钮增设了相关雷达功能点;
  4. 雷达区域为核心模块,包含模拟点各种功能效果,危险等级区域绘制,激光雷达等功能;
  5. 频谱区域主要显示音频频谱效果;
  6. 缩放模块控制雷达区域缩放效果;
  7. 信息采集区域采集雷达区域相关数据信息点数据展示;
  8. 可支持换肤;
  9. 可支持音频频谱显示;
  10. 可支持任意随机添加模拟点;
  11. 可支持自定义背景添加模拟点;
  12. 可支持方位,航向角,距离,速度,目标体真实图自定制;
  13. 可支持危险区域并且可等级划分,方位,角度,距离,危险提示信息等显示;
  14. 可支持激光发射模拟;
  15. 支持雷达图放大缩小显示;
  16. 可支持模拟点编辑设置;
  17. 可支持模拟点跟踪线设置;
  18. 可支持模拟点详细数据查看;
  19. 可支持增加添加目标体预览功能;
  20. 可支持增加航母目标体;
  21. 可支持增加歼击机目标体;
  22. 可支持增加指挥所目标体;
  23. 可支持增加航母炮弹攻击指挥使效果;
  24. 可支持增加航母导弹攻击指挥使效果;
  25. 可支持增加歼击机炮弹攻击指挥使效果;
  26. 可支持增加歼击机导弹攻击指挥使效果;
  27. 可支持增加指挥使被炸前,中, 后三种状态效果;

四、核心代码

自定义GraphicsButtonItem类继承自QGraphicsObject,收到按钮点击mousePressEvent事件后发射了clicked()信号,在外侧需要的地方绑定此信号,做相应槽函数响应即可。

GraphicsButtonItem::GraphicsButtonItem(QGraphicsItem *parent) :QGraphicsObject(parent)
{
	setCursor(QCursor(Qt::PointingHandCursor));
	initButton();
}

GraphicsButtonItem::~GraphicsButtonItem()
{

}

void GraphicsButtonItem::initButton()
{
	QPixmap pixmap(40, 40);
	pixmap.fill(Qt::transparent);
	QPainter painter(&pixmap);
	painter.setRenderHints(QPainter::Antialiasing);
	painter.setPen(Qt::NoPen);
	painter.setBrush(AppInstance::getInstance()->foreGroundColor);
	painter.drawRoundedRect(0, 0, 40, 40, 4, 4);
	setButtonPixmap(pixmap);
}

void GraphicsButtonItem::setButtonPixmap(const QPixmap& pixmap)
{
	prepareGeometryChange();
	m_pix = pixmap;
	update();
}

void GraphicsButtonItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
	if (event->button() == Qt::LeftButton)
		emit clicked();
	QGraphicsObject::mousePressEvent(event);
}

QSizeF GraphicsButtonItem::size() const
{
	return m_pix.size();
}

QRectF GraphicsButtonItem::boundingRect() const
{
	return QRectF(QPointF(0, 0), size());
}

void GraphicsButtonItem::setText(const QString& text)
{
	m_text = text;
	update();
}

void GraphicsButtonItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
	painter->save();
	painter->drawPixmap(0, 0, m_pix);
	painter->setPen(QColor(255, 255, 255, 150));
	painter->setBrush(Qt::NoBrush);
	QFont font = painter->font();
	font.setFamily("Microsoft YaHei");
	font.setBold(true);
	font.setPointSize(12);
	painter->setFont(font);
	painter->drawText(boundingRect(), Qt::AlignCenter, m_text);
	painter->restore();
}

五、效果图

在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨田哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值