RazrFalcon, это понятно, что нужно в две стороны alpha передавать. Я пока разбираюсь что бы alpha передать в одну сторону, а именно прямоугольным координатам. Я вроде всё сделал, alpha передаётся, но линия в прямоугольных координатах начинает двигаться от нуля, а не там, где были полярные координаты в момент переключения.
Что же я не так сделал?Для понимания, я напишу подробный код:Файлы h#ifndef L_H
#define L_H
#include <QLabel>
#include <QPainter>
#include <QTimer>
#include <math.h>
class l : public QLabel
{
Q_OBJECT
public:
explicit l(QWidget *parent = 0);
bool FlagDraw; // Флаг разрешения и запрещения рисования на label
float alpha; // Угол поворота
signals:
void alphaChanged(float);
public slots:
protected:
void paintEvent(QPaintEvent *);
};
#endif // L_H
#ifndef P_H
#define P_H
#include <QLabel>
#include <QPainter>
class p : public QLabel
{
Q_OBJECT
public:
explicit p(QWidget *parent = 0);
bool FlagDraw; // Флаг разрешения и запрещения рисования на label
float d;
float alpha;
signals:
public slots:
void setAlpha(float value);
protected:
void paintEvent(QPaintEvent *);
};
#endif // P_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QDialog>
#include <QTextCodec>
#include "l.h"
#include "p.h"
namespace Ui {
class mainwindow;
}
class mainwindow : public QDialog
{
Q_OBJECT
public:
explicit mainwindow(QWidget *parent = 0);
~mainwindow();
QTimer *timer;
QTimer *timer1;
l *lbl1;
p *lbl2;
bool FlagRunStop;
bool FlagPolaris;
bool FlagRect;
int FlagTimer; // Указывает какой таймер сейчас запущен или остановлен
public slots:
void onClick();
void onClick1();
void onTimer();
void onTimer1();
void BlockTimer();
private:
Ui::mainwindow *ui;
};
#endif // MAINWINDOW_H
Файлы cpp#include "l.h"
l::l(QWidget *parent) :
QLabel(parent)
{
FlagDraw = false;
alpha = 0.0;
}
// Вывод окружности и линию
void l::paintEvent(QPaintEvent *)
{
float x2 = 0.0, y2 = 0.0;
if (FlagDraw == true)
{
// рисуем окружность
QPainter Ellipse(this);
Ellipse.setBrush(QBrush(Qt::black));
Ellipse.drawEllipse(0, 0, l::width(), l::height());
// Рисуем линию
QPainter Line(this);
Line.setPen(Qt::green);
Line.translate(300, 300);
alpha += 2*M_PI/1000;
x2 = 300 * cos(alpha);
y2 = 300 * sin(alpha);
Line.drawLine(0, 0, x2, y2);
Line.rotate(alpha);
emit alphaChanged(alpha);
}
}
#include "p.h"
#include "math.h"
p::p(QWidget *parent) :
QLabel(parent)
{
FlagDraw = false;
d = 0.0;
}
// Вывод окружности и линию
void p::paintEvent(QPaintEvent *)
{
float x;
if (FlagDraw == true)
{
// рисуем прямоугольник
QPainter painterRect(this);
painterRect.setBrush(QBrush(Qt::black));
painterRect.drawRect(0, 0, p::width(), 600);
// Рисуем линию
QPainter Line(this);
Line.setPen(Qt::green);
if (d <= p::width())
{
setAlpha(alpha);
d += cos(alpha);
Line.drawLine(x, 600, x, 0);
}
else
d = 0.0;
}
}
void p::setAlpha(float value)
{
alpha = value;
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
mainwindow::mainwindow(QWidget *parent) :
QDialog(parent),
ui(new Ui::mainwindow)
{
ui->setupUi(this);
lbl1 = new l();
lbl2 = new p();
connect(lbl1, SIGNAL(alphaChanged(float)), lbl2, SLOT(setAlpha(float)));
FlagPolaris = false; // Начальное задание флага нажата ли кнопка "Полярные" первый раз или нет
FlagRect = false; // Начальное задание флага нажата ли кнопка "Прямоугольные" первый раз или нет
FlagRunStop = false; // Начальное задание флага для нажатия на кнопку "Запустить / Остановить"
// Для кодировки русского языка на виджетах
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); // Без этого кодировки БД не работает
QTextCodec::setCodecForTr(QTextCodec::codecForName("CP-1251"));
ui->pushButton_3->setEnabled(false); // По умолчанию кнопка "Запустить / Остановить" заблокирована
// Запуск полярных координат
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onClick()));
// Запуск прямоугольных координат
connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(onClick1()));
// Пауза таймера
connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(BlockTimer()));
}
mainwindow::~mainwindow()
{
delete ui;
}
void mainwindow::onClick()
{
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(onTimer()));
timer->start(1);
ui->pushButton->setEnabled(false);
}
void mainwindow::onClick1()
{
connect(lbl1, SIGNAL(alphaChanged(float)), lbl2, SLOT(setAlpha(float)));
timer1 = new QTimer(this);
connect(timer1, SIGNAL(timeout()), this, SLOT(onTimer1()));
timer1->start(1);
ui->pushButton_2->setEnabled(false);
}
void mainwindow::onTimer()
{
FlagTimer = 1;
FlagPolaris = true;
if (FlagRect == true)
{
timer1->blockSignals(true); // Блокировка таймера прямолинейных координат
FlagRect = false;
}
ui->pushButton_2->setEnabled(true); // Блокировка кнопки "Параллельные"
ui->label_3->setVisible(false); // Скрытие виджета вывода параллельных координат
ui->label->setVisible(true); // Открытие виджета вывода полярных координат
ui->label->FlagDraw = true;
ui->label->update(); // Рисование полярных координат
ui->pushButton->setEnabled(false);
ui->pushButton_3->setEnabled(true); // Разблокировать кнопку "Запустить / Остановить"
FlagRunStop = false;
ui->pushButton_3->setText(tr("Остановить"));
}
// Блокирование таймера
void mainwindow::BlockTimer()
{
if (FlagRunStop == true)
{
if (FlagTimer == 1)
{
timer->blockSignals(false); // Запустить таймер
ui->pushButton_3->setText(tr("Остановить"));
FlagRunStop = false;
}
else
{
timer1->blockSignals(false); // Запустить таймер
ui->pushButton_3->setText(tr("Остановить"));
FlagRunStop = false;
}
}
else
{
if (FlagTimer == 2)
{
timer1->blockSignals(true); // Остановить таймер
ui->pushButton_3->setText(tr("Запустить"));
FlagRunStop = true;
}
timer->blockSignals(true); // Остановить таймер
ui->pushButton_3->setText(tr("Запустить"));
FlagRunStop = true;
}
}
void mainwindow::onTimer1()
{
FlagTimer = 2;
FlagRect = true;
ui->pushButton->setEnabled(true); // Блокировка кнопки "Полярные"
//if (FlagPolaris > 1)
if (FlagPolaris == true)
{
timer->blockSignals(true); // Блокировка таймера полярных координат
FlagPolaris = false;
}
ui->label->setVisible(false); // Скрытие виджета вывода полярных координат
ui->label_3->setVisible(true); // Открытие виджета параллельных координат
ui->label_3->FlagDraw = true;
ui->label_3->update(); // Рисование прямолинейных координат
ui->pushButton_2->setEnabled(false);
ui->pushButton_3->setEnabled(true); // Разблокировать кнопку "Запустить / Остановить"
FlagRunStop = false;
ui->pushButton_3->setText(tr("Остановить"));
}