QTimer не работает, не меняется угол наклона линии
хотел написать программу, которая будет работать, как простой радар, за основу взял видео, где делают аналоговые часы, но в моей программе совершенно не работает поворот линии по таймеру. Пробовал в SLOT менять методы, использовал currentTime, но ничего не помогло. И если можно, задам еще один вопрос, при ручном изменение угла поворота линии, почему-то смещаются ее начальные значения, есть ли способ это как-то исправить? В QT я совсем новичок.
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPainter>
#include <QTimer>
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;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), SLOT(update()));
timer->start(1000);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter;
painter.begin(this);
painter.setRenderHint(QPainter::Antialiasing);
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); //рисование маленького круга
painter.drawLine(0,-290,0,230); //рисование вертикальной линии
painter.drawLine(-250,-20,260,-20);//рисование горизонтальной линии
painter.setPen(Qt::green);
painter.rotate(6.0*60);
painter.drawLine(0,-20,0,-270); //рисование линии, которая должна поворачиваться
painter.end();
}
Ответы (1 шт):
Автор решения: e.n.shirokov
→ Ссылка
mainwindow.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void onTimeout();
private:
int angle;
void paintEvent(QPaintEvent*) override;
};
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
angle = 0;
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MainWindow::onTimeout);
timer->start(1000);
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter;
painter.begin(this);
painter.translate(QPoint(width()/2,height()/2));
angle = (angle >= 0 && angle <= 350) ? angle+10 : 0;
painter.drawLine(0,-290,0,230); //рисование вертикальной линии
painter.drawLine(-250,0,260,0);//рисование горизонтальной линии
painter.setPen(Qt::green);
painter.rotate(angle);
painter.drawLine(0,0,0,-270); //рисование линии, которая должна поворачиваться
painter.end();
}
void MainWindow::onTimeout()
{
this->update(this->rect());
}