QT做方向箭头的雷达,做带指针的仪表盘

24 篇文章 0 订阅

效果图

在这里插入图片描述

可以在这基础上画雷达或者仪表盘

具体参考了两个博主的文章,一个是雷达的,一个是专门设置箭头的,进行了结合然后再效果上进行相应的改动 就是有点尴尬。。。哪两篇博文我忘了。。。。。如果原作者看到自己的代码,可以给小的说下,我会注明网址!!!

实现思想

在已有基础上,进行开放接口,可以在上层设置调用。
比如整个圆的大小,最大测量速度,最大测量角度等
这里开放了设置速度角度,最大测量速度已写,可以自己开放接口即可

代码实现

#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);
}


另外有什么需要加的功能也可以说噢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值