效果图
可以在这基础上画雷达或者仪表盘
具体参考了两个博主的文章,一个是雷达的,一个是专门设置箭头的,进行了结合然后再效果上进行相应的改动 就是有点尴尬。。。哪两篇博文我忘了。。。。。如果原作者看到自己的代码,可以给小的说下,我会注明网址!!!
实现思想
在已有基础上,进行开放接口,可以在上层设置调用。
比如整个圆的大小,最大测量速度,最大测量角度等
这里开放了设置速度角度,最大测量速度已写,可以自己开放接口即可
代码实现
#ifndef RADARCYCLE_H
#define RADARCYCLE_H
#include <QObject>
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QTimer>
#include <QLabel>
#include <QPropertyAnimation>
class RadarCycle : public QWidget
{
Q_OBJECT
Q_PROPERTY(int rotate READ getRotate WRITE setRotate)
public:
RadarCycle(QWidget* parent = nullptr);
void setSpeedAngle(double angle,double speed);
void init();
void paintCycle(QPaintEvent *event, int r1, int w); //画圆形
void paintTextScale(QPaintEvent *event); //设置文字
void paintPointer(QPaintEvent *event, double Angle, double speed); //设置方向速度
void paintLine(QPaintEvent *event); //画线
void paintPie(QPaintEvent *event);
int getRotate();
void setRotate(int rotate);
protected:
void paintEvent(QPaintEvent *event) override;
private:
int m_rotation;
float m_size,m_maxSpeed; //图尺寸
float m_speed,m_angle; //速度方向
};
#endif // RADARCYCLE_H
#include "radarcycle.h"
#include <math.h>
RadarCycle::RadarCycle(QWidget *parent):
QWidget (parent)
{
m_size = 25; //雷达图尺寸
m_speed = 0;
m_angle = 0;
m_maxSpeed = 80;
resize(parent->size());
show();
init();
}
//设置方向速度
void RadarCycle::setSpeedAngle(double angle, double speed)
{
m_speed = speed;
m_angle = angle;
}
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,m_size,1);
paintCycle(event,m_size*2,1);
paintCycle(event,m_size*3,1);
paintCycle(event,m_size*4,1);
paintCycle(event,m_size*5,4);
paintTextScale(event);
paintLine(event);
paintPie(event);
if(m_speed != 0)
paintPointer(event,m_angle,m_speed);
}
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<8; ++i)
{
QString txt = i < 10 ? QString::number(i*45): QString::number(i);
painter.drawText(-8, -rect.height()/2+10, txt);
painter.drawLine(0,m_size*5-m_size/2,0,m_size*5);
painter.rotate(45);
}
}
void RadarCycle::paintPointer(QPaintEvent *event,double Angle,double speed)
{
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.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(QBrush("#008B8B"),7));
painter.setFont(QFont("黑体", 10));
painter.drawText(width()-120,20,QString::number(speed)+"m/s, "+QString::number(Angle)+"°");
painter.setPen(QPen(QBrush(QColor(255,0,0)),2));
painter.translate(rect.width()/2,rect.height()/2);
if(speed<3)
speed = 3;
painter.restore();
painter.rotate(Angle-180);
painter.drawLine(0,0,0,speed/m_maxSpeed*m_size*5);
QBrush brush;
brush.setColor(Qt::red);
brush.setStyle(Qt::SolidPattern);
painter.setBrush(brush);
QPoint startPoint(0,0);
QPoint endPoint(0,speed/m_maxSpeed*m_size*5);
double par = 10.0;//箭头部分三角形的腰长
double slopy = atan2((endPoint.y() - startPoint.y()), (endPoint.x() - startPoint.x()));
double cosy = cos(slopy);
double siny = sin(slopy);
QPoint point1 = QPoint(endPoint.x() + int(-par*cosy - (par / 2.0*siny)), endPoint.y() + int(-par*siny + (par / 2.0*cosy)));
QPoint point2 = QPoint(endPoint.x() + int(-par*cosy + (par / 2.0*siny)), endPoint.y() - int(par / 2.0*cosy + par*siny));
QPoint points[3] = { endPoint, point1, point2 };
painter.setRenderHint(QPainter::Antialiasing, true);//消锯齿
QPen drawTrianglePen;//创建画笔
drawTrianglePen.setColor(Qt::red);
drawTrianglePen.setWidth(3);
painter.setPen(drawTrianglePen);
painter.drawPolygon(points, 3);//绘制箭头部分
drawTrianglePen.setWidth(2);
int offsetX = int(par*siny / 3);
int offsetY = int(par*cosy / 3);
QPoint point3, point4;
point3 = QPoint(endPoint.x() + int(-par*cosy - (par / 2.0*siny)) + offsetX, endPoint.y() + int(-par*siny + (par / 2.0*cosy)) - offsetY);
point4 = QPoint(endPoint.x() + int(-par*cosy + (par / 2.0*siny) - offsetX), endPoint.y() - int(par / 2.0*cosy + par*siny) + offsetY);
QPoint arrowBodyPoints[3] = { startPoint, point3, point4 };
painter.drawPolygon(arrowBodyPoints, 3,Qt::WindingFill);//绘制箭身部分
// painter.drawText(0,0, QString::number(Angle )+","+ QString::number(speed));
}
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.setFont(QFont("黑体", 11));
painter.setPen(QPen(QBrush("#008B8B"),2));
for(auto i = 1;i<=4;i++)
{
QPointF pf(0,-m_size*i);
painter.drawText(pf,QString::number(i*15));
}
// for (int i=0; i<360; ++i)
// {
// painter.drawLine(m_size*5-m_size/3-6,0,m_size*5-m_size/3,0);
// painter.rotate(1);
// }
for (int i=0; i<4; ++i)
{
painter.drawLine(0,0,0,m_size*5-m_size/3);
painter.rotate(90);
}
// for (int i=0; i<72; ++i)
// {
// painter.drawLine(0,m_size*5-m_size/3,0,m_size*5-m_size/3);
// 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);
}
另外有什么需要加的功能也可以说噢!