QT ПЕРЕНОСИМ ДАННЫЕ ПЕРЕМЕННОЙ ИЗ ОДНОЙ ФОРМЫ В ДРУГУЮ.

Долго не мог справиться с этой задачкой и тут вдруг как будто открылись глаза. В принципе, решение нашлось даже не в самом последней статье из списка поиска гугла. Ну, порой из таких статей бывает трудно вычленить то, что тебе нужно, особенно из десятистраничногл диалога бедалаги ученика и какого-нибудь заумного дяди, который ленится объянить подробнее. Как я понял, опытному программисту решение этого вопроса кажется настолько очевидным, что ему тут и не о чем поговорить.
Итак, задача: при открытие дочерней формы, мы хотим получить данные из родительской. Решение: используем сигналы и слоты.
Создадим классы формы QtDesigner ui/h
form1 .h и form2.h
1. Идем в заголовочный файл первой формы.
class form1 : public QMainWindow {
...
signals:
void send(double);
...
}
2. Идем в заголовочный файл второй формы
class form2 : public QMainWindow {
...
public slots:
void getSended(double clicked);
...
}
3. Переходим в form1.cpp и делаем сигнал передатчика
connect(this,SIGNAL(send(double)),frm,SLOT(getSended(double))); emit send(clicked);
4. Далее в form2.cpp и добавляем определение слота приемника getSended
void form2::getSended(double clicked){
ui->label->setText(QString::number(clicked));
}
В общем, с овновной идеей все, теперь полный листинг.
form1.h
#ifndef FORM1_H
#define FORM1_H
#include "QMainWindow"
QT_BEGIN_NAMESPACE
namespace Ui { class form1; }
QT_END_NAMESPACE
class form1 : public QMainWindow
{
Q_OBJECT
public:
form1(QWidget *parent = nullptr);
~form1();
void moveToCenter(); //Функция выравнивания по центру экрана
private slots:
void catcher();
signals:
void send(double);
private:
Ui::form1 *ui;
};
#endif // FORM1_H
form2.h
#ifndef FORM2_H
#define FORM2_H
#include "QWidget"
namespace Ui {
class form2;
}
class form2 : public QWidget
{
Q_OBJECT
public:
explicit form2(QWidget *parent = nullptr);
~form2();
void moveToCenter(); //функция выравнивания окна по центру
public slots:
void getSended(double clicked);
private:
Ui::form2 *ui;
};
#endif // FORM2_H
form1.cpp
#include "form1.h"
#include "ui_form1.h"
#include "form2.h"
#include "QPushButton"
#include "QDesktopWidget" //Для выравнивания по центру экрана
form1::form1(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::form1)
{
ui->setupUi(this);
connect(ui->btn1, SIGNAL(clicked()), this, SLOT(catcher())); //Создаем слоты для кнопок, которые обрабатываются методом checker
connect(ui->btn2, SIGNAL(clicked()), this, SLOT(catcher()));
moveToCenter();
}
form1::~form1()
{
delete ui;
}
void form1:: catcher(){ //
QPushButton *button = (QPushButton *)sender(); //Ловим сигнал нажатия кнопки
double clicked = button->text().toDouble(); //Записываем циферь текста кнопки в переменную clicked
form2 *frm = new form2(); //Объявляем
connect(this,SIGNAL(send(double)),frm,SLOT(getSended(double)));
emit send(clicked);//emit зарезервированное слово Qt для запуска сигнала
this->close();
frm->show();
}
//Эта функция выравнивает наше окошко по центру экрана
void form1::moveToCenter(){
QRect rect = frameGeometry();
rect.moveCenter(QDesktopWidget().availableGeometry().center());
move(rect.topLeft());
}
form2.cpp
#include "form2.h"
#include "ui_form2.h"
#include "QDesktopWidget" //Для выравнивания по центру экрана
form2::form2(QWidget *parent) :
QWidget(parent),
ui(new Ui::form2)
{
ui->setupUi(this);
moveToCenter(); //Функция выравнивания по центру экрана
}
form2::~form2()
{
delete ui;
}
void form2::getSended(double clicked){
ui->label->setText(QString::number(clicked));
}
//Эта функция выравнивает наше окошко по центру экрана
void form2::moveToCenter(){
QRect rect = frameGeometry();
rect.moveCenter(QDesktopWidget().availableGeometry().center());
move(rect.topLeft());
}

