用Qt画一个全方位雷达扫描

示例1

Qt画一个全方位雷达扫描

#include <QPainter>
#include <QWidget>
#include <QTimer>
#include <qmath.h>
#include <QApplication>

class Radar : public QWidget {
public:
    Radar(QWidget *parent = 0);
protected:
    void paintEvent(QPaintEvent *event);
private:
    QTimer *timer;
    float angle;
};
Radar::Radar(QWidget *parent)
    : QWidget(parent), angle(0) {
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(10); // 每10毫秒进行一次更新
}
void Radar::paintEvent(QPaintEvent * /* event */) {
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    // 绘制雷达扫描区域
    painter.setPen(QColor("#00ff00"));
    painter.drawEllipse(10, 10, width() - 20, height() - 20);
    // 绘制雷达扫描线
    painter.setPen(QColor("#ff0000"));
    painter.drawLine(width() / 2, height() / 2,
                     width() / 2 + (width() - 20) / 2 * qCos(qDegreesToRadians(angle)),
                     height() / 2 + (height() - 20) / 2 * qSin(qDegreesToRadians(angle)));
    // 绘制雷达扫描中心点
    painter.setBrush(QColor("#ff0000"));
    painter.drawEllipse(width() / 2 - 5, height() / 2 - 5, 10, 10);
    angle = (angle + 1) ;// 更新雷达扫描角度
}
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    Radar radar;
    radar.setWindowTitle("radar");
    radar.resize(400, 400);
    radar.show();
    return app.exec();
}

使用QPainter在paintEvent中绘制雷达扫描区域、雷达扫描线和雷达扫描中心点。使用QTimer定时更新雷达扫描角度。在main函数中创建Radar对象并显示。

示例2

复杂的全方位雷达扫描,具体步骤如下:

创建一个Qt项目,并添加一个主窗口。

新建Qt Widgets Application项目,添加MainWindow类。

在主窗口上添加一个QGraphicsView控件,用于绘制雷达扫描。

在MainWindow类的构造函数中添加以下代码:

QGraphicsView *view = new QGraphicsView(this);
view->setGeometry(20, 20, 400, 400);
  • 创建一个QGraphicsScene对象,并将其设置为QGraphicsView的场景。

在MainWindow类的构造函数中添加以下代码:

QGraphicsScene *scene = new QGraphicsScene(this);
view->setScene(scene);
  • 在QGraphicsScene中添加一个QGraphicsEllipseItem对象,用于表示雷达扫描的圆形区域。

在MainWindow类的构造函数中添加以下代码:

QGraphicsEllipseItem *circle = new QGraphicsEllipseItem(0, 0, 400, 400);
circle->setPen(QPen(Qt::NoPen));
circle->setBrush(QBrush(Qt::white));
circle->setZValue(-1);
scene->addItem(circle);
  • 在QGraphicsScene中添加一些QGraphicsLineItem对象,用于表示雷达扫描的扫描线。

在MainWindow类的构造函数中添加以下代码:

for (int i = 0; i < 180; i += 10) {
    QLineF line(200, 200, 200 + 200 * cos(i * M_PI / 180),
                200 - 200 * sin(i * M_PI / 180));
    QGraphicsLineItem *scanLine = new QGraphicsLineItem(line);
    scanLine->setPen(QPen(Qt::red, 2));
    scanLine->setRotation(-i);
    scanLine->setZValue(1);
    scene->addItem(scanLine);
}

  • 在QGraphicsScene中添加一个QGraphicsPolygonItem对象,用于表示雷达扫描的中心点。

在MainWindow类的构造函数中添加以下代码:

QPointF points[3] = { QPointF(200, 200),
                      QPointF(195, 190),
                      QPointF(205, 190) };
QGraphicsPolygonItem *center = new QGraphicsPolygonItem(QPolygonF(points, 3));
center->setPen(QPen(Qt::NoPen));
center->setBrush(QBrush(Qt::red));
center->setTransformOriginPoint(200, 200);
center->setZValue(2);
scene->addItem(center);
  • 在主窗口的槽函数中更新雷达扫描的扫描线的旋转角度。

在MainWindow类中添加以下私有成员变量:

int angle;

在MainWindow类的构造函数中添加以下代码:

angle = 0;

在MainWindow类中添加以下槽函数:

void MainWindow::updateScanLine() {
    angle += 10;
    angle %= 360;
    QList<QGraphicsItem*> items = ui->graphicsView->scene()->items();
    for (int i = 0; i < items.size(); i++) {
        QGraphicsLineItem *line = dynamic_cast<QGraphicsLineItem*>(items[i]);
        if (line) {
            line->setRotation(line->rotation() + 10);
        }
    }
}
  • 使用QGraphicsBlurEffect对象,对雷达扫描的圆形区域进行模糊处理,以增强立体感。

在MainWindow类的构造函数中添加以下代码:

QGraphicsBlurEffect *effect = new QGraphicsBlurEffect(this);
effect->setBlurRadius(10);
circle->setGraphicsEffect(effect);
  • 使用QGraphicsOpacityEffect对象,对雷达扫描的中心点进行透明度处理,以增强立体感。

在MainWindow类的构造函数中添加以下代码:

QGraphicsOpacityEffect *opacityEffect = new QGraphicsOpacityEffect(this);
opacityEffect->setOpacity(0.5);
center->setGraphicsEffect(opacityEffect);
  • 在主窗口中添加一个QTimer控件,定时更新雷达扫描的扫描线的旋转角度。

在MainWindow类的构造函数中添加以下代码:

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateScanLine()));
timer->start(100);

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

猜你喜欢

转载自blog.csdn.net/m0_60259116/article/details/129939214