
Qt实现仿真雷达效果功能
1.绘制类似雷达网状圈
2.绘制中心十字
3.绘制扫描的弧形
4.绘制随机点,进行显示
#pragma once
#include
#include
#include
#include 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);
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!