First, the effect preview
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]