Qt自定义控件:雷达扫描
1、功能
制作一个雷达扫描仪
2、实现
重写窗口的绘画事件paintEvent
,并使用画笔QPainter
进行绘制,使用drawRect
绘制黑色背景,使用drawEllipse
雷达圈,使用drawLine
绘制水平垂直线,使用drawPie
绘制扇形扫描区,用定时器QTimer
刷新界面以达到动态效果
3、效果
4、源码
a、头文件
#ifndef RADARSCANNER_H
#define RADARSCANNER_H#include <QTimer>
#include <QWidget>class RadarScanner : public QWidget {Q_OBJECTpublic:explicit RadarScanner(QWidget *parent = nullptr);protected:void paintEvent(QPaintEvent *event);private:QTimer *timer_ = nullptr;int start_angle_ = 0;
};#endif // RADARSCANNER_H
b、源文件
#include "radarscanner.h"#include <QPainter>RadarScanner::RadarScanner(QWidget *parent) : QWidget(parent) {setWindowTitle(tr("Radar Scanner"));timer_ = new QTimer(this);connect(timer_, &QTimer::timeout, [=]() {update();start_angle_ = (start_angle_ + 30) % 360;});timer_->setInterval(100); // 100ms刷新一次timer_->start();
}void RadarScanner::paintEvent(QPaintEvent *event) {Q_UNUSED(event);// 绘制背景色QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);painter.setBrush(Qt::black);painter.drawRect(rect());const int ring_num = 7; // 圆环的数量const int incr_Value = height() / 2 / ring_num; // 最小圆半径(递增值)const int ext_rect_h =incr_Value * ring_num; // 最大圆的半径(外接正方形的高的一半)// 绘制圆圈painter.setBrush(Qt::NoBrush);painter.translate(rect().center()); // 画笔窗口的中心QPen pen(Qt::green, 3);painter.setPen(pen);for (int i = 0; i <= ring_num; i++) {painter.drawEllipse(QPoint(0, 0), incr_Value * i, incr_Value * i);}// 水平垂直线painter.drawLine(-ext_rect_h, 0, ext_rect_h, 0);painter.drawLine(0, -ext_rect_h, 0, ext_rect_h);// 绘制扫描扇形painter.setPen(Qt::NoPen);QConicalGradient gradient(0, 0, -start_angle_); // 角度渐变gradient.setColorAt(0, QColor(0, 255, 0, 200));gradient.setColorAt(0.1, QColor(0, 255, 0, 100));gradient.setColorAt(0.2, QColor(0, 255, 0, 0));gradient.setColorAt(1, QColor(0, 255, 0, 0));painter.setBrush(gradient);// 这里*16的原因,Qt绘制单位1/16°,70是扇形角度QRect pie_rect(-ext_rect_h, -ext_rect_h, ext_rect_h * 2, ext_rect_h * 2);painter.drawPie(pie_rect, -start_angle_ * 16, 70 * 16);
}
对你有用就点个赞👍,以后需要用到就收藏⭐