Qt实现类似雷达检测功能

在这里插入图片描述

Qt实现仿真雷达效果功能
1.绘制类似雷达网状圈
2.绘制中心十字
3.绘制扫描的弧形
4.绘制随机点,进行显示
#pragma once
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QTimer>


class RadarWidget : public QWidget
{
	Q_OBJECT
public:
	explicit RadarWidget(QWidget* parent = nullptr);

	~RadarWidget();
protected:
	void paintEvent(QPaintEvent* pEvent);

	void showEvent(QShowEvent* pEvent);

private:

	void initWin();

	void drawCorssLine(QPainter* painter);

	void drawCircle(QPainter* painter);

	void drawArc(QPainter* painter);

	void drawPoint(QPainter* painter);

private slots:
	void angleTimer();

	void newPoint();
private:
	QTimer* m_pTimer;

	QTimer* m_pPointTimer;

	QLine m_line;

	QRect m_drawRect;

	int m_iRotateValue;

	QVector<QPointF> m_pointVec;
};

#include "RadarMap.h"

RadarWidget::RadarWidget(QWidget* parent)
	: QWidget(parent)
	, m_iRotateValue(0)
{
	this->initWin();
}

RadarWidget::~RadarWidget()
{
	if (this->m_pPointTimer->isActive())
	{
		this->m_pPointTimer->stop();
		m_pPointTimer->deleteLater();
	}

	if (this->m_pTimer->isActive())
	{
		this->m_pTimer->stop();
		m_pTimer->deleteLater();
	}
}
void RadarWidget::initWin()
{
	this->setStyleSheet("background-color:black");
	this->resize(600, 600);
	m_pTimer = new QTimer(this);
	connect(m_pTimer, &QTimer::timeout, this, &RadarWidget::angleTimer);
	m_pTimer->start(100);

	m_pPointTimer = new QTimer(this);
	connect(m_pPointTimer, &QTimer::timeout, this, &RadarWidget::newPoint);
	m_pPointTimer->start(1000);
}

void RadarWidget::drawCorssLine(QPainter* painter)
{
	QPen pen;
	pen.setColor(Qt::gray);
	pen.setWidth(2);
	painter->setPen(pen);
	auto w = this->width() / 2;
	auto h = this->height() / 2;

	m_line.setLine(w - 1, 20, w - 1, this->height() - 20);
	painter->drawLine(m_line);
	painter->drawLine(20, h - 1, this->width() - 20, h - 1);

}

void RadarWidget::drawCircle(QPainter* painter)
{
	//绘制网状圆
	painter->setPen(Qt::white);
	QPoint point = m_drawRect.center();
	auto y = m_line.y1();
	auto r = abs(y - point.y());
	for (int i = 1; i <= 5; i++)
	{
		auto w = (int)(r * (i / 5.0));
		painter->drawEllipse(point, w, w);
	}
}

void RadarWidget::drawArc(QPainter* painter)
{
	//绘制移动扇形
	QPoint center = m_drawRect.center();
	auto y = m_line.y1();
	auto r = abs(y - center.y());
	qreal x = center.x() + (qreal)(r * cos(-m_iRotateValue * 3.1415926 / 180));
	qreal y1 = center.y() + (qreal)(r * sin(-m_iRotateValue * 3.1415926 / 180));
	painter->setPen(Qt::white);
	painter->drawLine(center, QPointF(x, y1));

	//圆弧渐变颜色
	QConicalGradient gradient;
	gradient.setCenter(center);
	gradient.setAngle(m_iRotateValue + 180);
	gradient.setColorAt(0.4, QColor(255, 255, 255, 100));
	gradient.setColorAt(0.8, QColor(255, 255, 255, 0));
	painter->setBrush(QBrush(gradient));
	painter->setPen(Qt::NoPen);
	painter->drawPie(this->m_drawRect, m_iRotateValue * 16, 90 * 16);
}

void RadarWidget::drawPoint(QPainter* painter)
{
	QPen pen;
	pen.setWidth(5);
	foreach(QPointF pos, this->m_pointVec)
	{
		if (this->m_drawRect.contains(pos.x(), pos.y()))
		{
			pen.setColor(Qt::red);
			painter->setPen(pen);
			painter->drawPoint(pos);
		}
		else
		{
			pen.setColor(Qt::white);
			painter->setPen(pen);
			painter->drawPoint(pos);
		}
	}
}

void RadarWidget::paintEvent(QPaintEvent* pEvent)
{
	QPainter painter(this);
	painter.setRenderHint(QPainter::Antialiasing);
	this->drawCorssLine(&painter);

	this->drawCircle(&painter);

	this->drawArc(&painter);

	this->drawPoint(&painter);

	QWidget::paintEvent(pEvent);
}

void RadarWidget::angleTimer()
{
	m_iRotateValue -= 10;
	update();
}

void RadarWidget::newPoint()
{
	m_pointVec.clear();
	for (int i = 0; i < 5; i++)
	{
		auto x = qrand() % this->width();
		auto y = qrand() % this->height();

		m_pointVec.push_back(QPointF(x, y));
	}

	this->update();
}

void RadarWidget::showEvent(QShowEvent* pEvent)
{
	m_drawRect.setRect(20, 20, this->width() - 40, this->height() - 40);
	QWidget::showEvent(pEvent);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Pailugou

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

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

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

打赏作者

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

抵扣说明:

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

余额充值