Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: alexu007 от Май 25, 2022, 16:17



Название: Радар
Отправлено: alexu007 от Май 25, 2022, 16:17
Радар:
Код:
#ifndef WIDGET_H
#define WIDGET_H

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


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;

    void paintEvent(QPaintEvent *event);
    QTimer* mytimer;

    QPoint create_p(int);

    QList<QPoint> pl;

    int fl_start;
    bool fl_stop;

public slots:
    void press_pbtn_01();
    void press_pbtn_02();

    void event_mytimer();

};
#endif // WIDGET_H

Код:
#include "widget.h"
#include "ui_widget.h"




Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    mytimer = new QTimer();

    fl_start = false;
    fl_stop = false;

    QObject::connect(ui->pbtn_01, SIGNAL(clicked()), this, SLOT(press_pbtn_01()));
    QObject::connect(ui->pbtn_02, SIGNAL(clicked()), this, SLOT(press_pbtn_02()));

    QObject::connect(mytimer, SIGNAL(timeout()), this, SLOT(event_mytimer()));
}




Widget::~Widget()
{
    delete ui;
}




void Widget::press_pbtn_01()
{

    QPoint p;
    p.setX(width()/2);
    p.setY(height()/2+20);

    for(int i = 0; i < 10; i++) pl << p;

    fl_start = 1;
    fl_stop = false;

    mytimer->start(20);
}



void Widget::press_pbtn_02()
{
    fl_stop = true;
}



QPoint Widget::create_p(int i)
{
    QPoint p;

    float a1 = width()/2;
    float b1 = height()/2+20;

    float rad = i * 3.14159/180;

    p.setX(a1 + 165*cos(rad));
    p.setY(b1 + 165*sin(rad));

    return p;
}




void Widget::event_mytimer()
{
    static int i = 270;

    for(int j = 0; j < fl_start; j++)
    {
        pl[j] = create_p(i+9-j);
    }

    if(fl_stop)
    {
        pl.removeLast();

        if(pl.size() == 1)
                mytimer->stop();
    }

    i++;
    if(i > 359) i == 0;

    if(fl_start < 9) fl_start++;

    this->repaint();
}



void Widget::paintEvent(QPaintEvent *event)
{
    QPainter Pn(this);
    QPoint p1, p2;

    Pn.setRenderHint(QPainter::Antialiasing);

    QPen penG(Qt::gray);
    penG.setWidth(2);
    Pn.setPen(penG);

    p1.setX(30);
    p1.setY(height()/2+20);
    p2.setX(width()-30);
    p2.setY(height()/2+20);

    Pn.drawLine(p1, p2);

    p1.setX(width()/2);
    p1.setY(47);
    p2.setX(width()/2);
    p2.setY(height()-10);

    Pn.drawLine(p1,p2);

    p1.setX(width()/2);
    p1.setY(height()/2+20);

    Pn.drawEllipse(p1, width()/8, width()/8);
    Pn.drawEllipse(p1, width()/4, width()/3.8);
    Pn.drawEllipse(p1, width()/2.6, width()/2.6);


    QColor clr;
    QPen penGr(clr);
    penGr.setWidth(2);

    for(int i = 0; i < pl.size(); i++)
    {
        clr.setRgb(0, 255, 255, 150-i*15);
        penGr.setColor(clr);
        Pn.setPen(penGr);
        Pn.drawLine(p1, pl.at(i));
    }
}