Не получается сделать раздельную отрисовку фигур по таймеру

у меня есть программа (радар), в ней есть линия, которая меняет угол наклона по нажатию кнопки и есть круг, который должен менять свое расположение на окружности, но у меня не получается это сделать отдельно, я пытался сделать функцию в слоте, но дальше не понимаю что нужно делать, так как метод не содержит в себе QPaintEvent или QPainter, пытался их добавить, но возникали ошибки. Добавил общий таймер, но тогда линия двигается независимо от нажатия кнопки. Подскажите пожалуйста, что нужно написать в методе или в какую сторону двигать вообще?

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPainter>
#include <QTimer>
#include <QtCore>
#include <QGraphicsItem>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

protected:
    void paintEvent(QPaintEvent*) override;

private slots:
        void onTimeout();

        void on_pushButton_clicked();
        void on_pushButton_2_clicked();
        void redraw(); //метод для отрисовки круга

private:
        int angle;
        QTimer timer;

        static int random(int low, int high)
        {
            int r=320;
            double h;
            h=sqrt(low*low+high*high);
            while (h<r)
            return (qrand() % ((high + 1) - low) + low);
        }

};


#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
#include <QGraphicsItem>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    angle = 0;
    QTimer *timer1 = new QTimer(this);
    connect(timer1,SIGNAL(timeout()), this, SLOT(onTimeout())); // общий таймер
    timer1->start(200);
}

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

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter;
        painter.begin(this);

        painter.translate(QPoint(width()/2,height()/2));
        int R = 1.6*qMin(width()/2,height()/2);
        painter.drawEllipse(-235,-270,R,R); //рисование большого круга
        painter.drawEllipse(-180,-215,R/1.3,R/1.3); //рисование среднего круга
        painter.drawEllipse(-130,-160,R/1.8,R/1.8);
        angle = (angle >= 0 && angle <= 350) ? angle+10 : 0;

        painter.drawLine(0,-290,0,230); //рисование вертикальной линии
        painter.drawLine(-250,0,260,0);//рисование горизонтальной линии

        painter.setPen(Qt::NoPen);
        painter.setBrush(Qt::red);
        painter.drawEllipse(random(-200,170),random(-250,160),30,30); // пример рисования круга

        painter.setPen(Qt::green);
        painter.rotate(angle);
        painter.drawLine(0,0,0,-270); //рисование линии, которая должна поворачиваться


        painter.end();
}

void MainWindow::onTimeout()
{
    this->update(this->rect());
}


void MainWindow::on_pushButton_clicked()
{
    connect(&timer,SIGNAL(timeout()), this, SLOT(onTimeout()));
    timer.start(200);
}

void MainWindow::on_pushButton_2_clicked()
{
    connect(&timer,SIGNAL(timeout()), this, SLOT(onTimeout()));
    timer.stop();
}

void MainWindow::redraw() //метод для отрисовки круга на новых координатах
{
    painter.setPen(Qt::NoPen);
    painter.setBrush(Qt::red);
    drawEllipse(random(-200,170),random(-250,160),30,30);
}

Ответы (1 шт):

Автор решения: e.n.shirokov

Заведи два таймера, но смену координат точки и смену угла наклона линии вытащи из paintEvent() и помести каждую в свой слот.

void MainWindow::onTimeout2()
{
    // смена угла линии
    angle = (angle >= 0 && angle <= 350) ? angle+10 : 0;
    this->update(this->rect());
}

void MainWindow::onTimeout1()
{
    // смена координат круга
    // ...
    this->update(this->rect());
}
→ Ссылка