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()); }