Не получается сделать раздельную отрисовку фигур по таймеру
у меня есть программа (радар), в ней есть линия, которая меняет угол наклона по нажатию кнопки и есть круг, который должен менять свое расположение на окружности, но у меня не получается это сделать отдельно, я пытался сделать функцию в слоте, но дальше не понимаю что нужно делать, так как метод не содержит в себе 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 шт):
Заведи два таймера, но смену координат точки и смену угла наклона линии вытащи из paintEvent() и помести каждую в свой слот.
void MainWindow::onTimeout2()
{
// смена угла линии
angle = (angle >= 0 && angle <= 350) ? angle+10 : 0;
this->update(this->rect());
}
void MainWindow::onTimeout1()
{
// смена координат круга
// ...
this->update(this->rect());
}