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

form1

Долго не мог справиться с этой задачкой и тут вдруг как будто открылись глаза. В принципе, решение нашлось даже не в самом последней статье из списка поиска гугла. Ну, порой из таких статей бывает трудно вычленить то, что тебе нужно, особенно из десятистраничногл диалога бедалаги ученика и какого-нибудь заумного дяди, который ленится объянить подробнее. Как я понял, опытному программисту решение этого вопроса кажется настолько очевидным, что ему тут и не о чем поговорить.

Итак, задача: при открытие дочерней формы, мы хотим получить данные из родительской. Решение: используем сигналы и слоты.

Создадим классы формы 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());
}

form2

Скачать сырцы