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);
}
Qt实现类似雷达检测功能
于 2022-09-23 14:24:19 首次发布