QPainter QConicalGradient QPropertyAnimation drawn radar basic drawing (b)

First, the effect preview
Here Insert Picture Description
two, the code idea
QPainter drawing background, QConicalGradient color gradient configuration objects, animation created using QPropertyAnimation
III snippet

#include "radarcycle.h"

RadarCycle::RadarCycle(QWidget *parent):
    QWidget (parent)
{
    resize(parent->size());
    show();
    init();
}
int RadarCycle::getRotate()
{
    return m_rotation;
}

void RadarCycle::setRotate(int rotate)
{
    m_rotation = rotate;
    update();
}
void RadarCycle::init()
{
    m_rotation = 0;
    QPropertyAnimation *animation = new QPropertyAnimation(this, "rotate");
    animation->setEasingCurve(QEasingCurve::Linear);
    animation->setDuration(18000);
    animation->setStartValue(0);
    animation->setEndValue(360);
    animation->setLoopCount(-1);
    animation->start(QAbstractAnimation::DeleteWhenStopped);
}

void RadarCycle::paintEvent(QPaintEvent *event)
{
    paintCycle(event,46,1);
    paintCycle(event,46*2,1);
    paintCycle(event,46*3,1);
    paintCycle(event,46*4,1);
    paintCycle(event,46*5,4);
    paintTextScale(event);
    paintLine(event);
    paintPie(event);
}

void RadarCycle::paintCycle(QPaintEvent *event,int r,int w)
{
    QRect rect = event->rect();
    if(rect.width()>rect.height())
        rect = QRect(rect.x(),rect.y(),rect.height(),rect.height());
    else {
        rect = QRect(rect.x(),rect.y(),rect.width(),rect.width());
    }
    QPainter painter(this);
    painter.save();
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setPen(QPen(QBrush("#008B8B"),w));
    painter.drawEllipse(QPoint(rect.width()/2,rect.height()/2),r,r);
    painter.restore();
}

void RadarCycle::paintTextScale(QPaintEvent *event)
{
    QRect rect = event->rect();
    if(rect.width()>rect.height())
        rect = QRect(rect.x(),rect.y(),rect.height(),rect.height());
    else {
        rect = QRect(rect.x(),rect.y(),rect.width(),rect.width());
    }
    QPainter painter(this);
    painter.translate(rect.width()/2,rect.height()/2);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setPen(QPen(QBrush("#008B8B"),2));

    for (int i=0; i<36; ++i)
    {
        QString txt = i < 10 ? "0" + QString::number(i) + "0" : QString::number(i)+"0";
        painter.drawText(-8, -rect.height()/2+40, txt);
        painter.drawLine(0,198,0,213);
        painter.rotate(10);
    }
}

void RadarCycle::paintLine(QPaintEvent *event)
{
    QRect rect = event->rect();
    if(rect.width()>rect.height())
        rect = QRect(rect.x(),rect.y(),rect.height(),rect.height());
    else {
        rect = QRect(rect.x(),rect.y(),rect.width(),rect.width());
    }
    QPainter painter(this);
    painter.translate(rect.width()/2,rect.height()/2);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setPen(QPen(QBrush("#008B8B"),2));

    for (int i=0; i<360; ++i)
    {
        painter.drawLine(207,0,213,0);
        painter.rotate(1);
    }

    for (int i=0; i<4; ++i)
    {
        painter.drawLine(0,173,0,213);
        painter.rotate(90);
    }

    for (int i=0; i<4; ++i)
    {
        painter.drawLine(0,173,0,213);
        painter.rotate(90);
    }

    for (int i=0; i<72; ++i)
    {
        painter.drawLine(0,202,0,213);
        painter.rotate(5);
    }
}

void RadarCycle::paintPie(QPaintEvent *event)
{
    QRect rect = event->rect();
    if(rect.width()>rect.height())
        rect = QRect(rect.x(),rect.y(),rect.height(),rect.height());
    else {
        rect = QRect(rect.x(),rect.y(),rect.width(),rect.width());
    }
    QRect rectColor = rect;
    int dx = 63;
    rect = rect.adjusted(dx,dx,-dx,-dx);
    QPainter painter(this);
    QConicalGradient gradient(rectColor.width() / 2, rectColor.height() / 2, m_rotation+180);
    gradient.setColorAt(0.1, QColor(15, 45, 188, 200));
    gradient.setColorAt(1, QColor(15, 45, 188, 0));
    painter.setBrush(gradient);
    painter.setPen(QPen(Qt::NoPen));
    int startAngle = m_rotation * 16;
    int spanAngle = 90 * 16;
    painter.drawPie(rect, startAngle, spanAngle);
}
#ifndef RADARCYCLE_H
#define RADARCYCLE_H

#include <QObject>
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QTimer>
#include <QPropertyAnimation>
class RadarCycle : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(int rotate READ getRotate WRITE setRotate)
public:
    RadarCycle(QWidget* parent = nullptr);
    void init();
    void paintCycle(QPaintEvent *event, int r1, int w);
    void paintTextScale(QPaintEvent *event);
    void paintLine(QPaintEvent *event);
    void paintPie(QPaintEvent *event);
    int getRotate();
    void setRotate(int rotate);
protected:
    void paintEvent(QPaintEvent *event) override;
private:
    int m_rotation;
};
#endif // RADARCYCLE_H

e-mail: [email protected]

Published 30 original articles · won praise 1 · views 1158

Guess you like

Origin blog.csdn.net/u010906468/article/details/104684197