Почему не передается сигнал во вторую форму?

Пишу программу на С++ в Qt, суть программы в том, что есть одно окно с тремя кнопками, каждая кнопка открывает новое окно и должна передать ему свой номер, типо если первая кнопка то номер один и тд. Но у меня не получается это сделать, сигнал из одного окна просто не проходит во второе, я решил разобраться на простом примере что когда нажимаем на кнопку то просто происходит сигнал и второе окно должно его поймать и вывести "OPENED!!" вот как я это сделал:

MainWindow.h:

#include <QMainWindow>
#include "mathwindow.h"
    
QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
QT_END_NAMESPACE
    
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    MainWindow(QWidget *parent = nullptr);
     ~MainWindow();
    
private slots:
    void openNewWindow();
signals:
    void buttonN();
private:
    Ui::MainWindow *ui;
};

Mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

mathwindow *math;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(openNewWindow()));
}

MainWindow::~MainWindow()
{
    delete ui;
}
    
void MainWindow::openNewWindow() {
    math = new mathwindow();
    math->show();
    emit buttonN();
}

mathwindow.h:

#include <QWidget>
#include "mainwindow.h"
    
namespace Ui {
    class mathwindow;
}
    
class mathwindow : public QWidget
{
    Q_OBJECT
    
public:
    explicit mathwindow(QWidget *parent = nullptr);
    ~mathwindow();
 public slots:
    void grabValue();
 private:
    Ui::mathwindow *ui;
 };

mathwindow.cpp

#include "mathwindow.h"

#include "ui_mathwindow.h"
#include <QDebug>
mathwindow::mathwindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::mathwindow)
{
    ui->setupUi(this);
    MainWindow var;
    connect(&var,SIGNAL(buttonN()),this,SLOT(grabValue()));
}

mathwindow::~mathwindow()
{
    delete ui;
}

void mathwindow::grabValue() {
    qDebug()<<"OPENED!!";
}

И слово OPENED!! никак почему то не выводиться, я подозреваю что это потому что я в одной функции открываю второе окно и сразу вырабатывается сигнал, помогите как это реализовать?

Чтобы когда открывалось второе окно ему сразу передавался нужный сигнал.


Ответы (1 шт):

Автор решения: Alexander Chernin

Можно сделать вот так - здесь mathwindow это поле класса главного окна (объект _mathWindow см. внизу класса MainWindow):

#include "mathwindow.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr) 
    : QMainWindow(parent) {
        ui->setupUi(this);
        connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(openNewWindow()));
    }

    ~MainWindow() {
    }

private slots:
    void openNewWindow() {
        // Если окно еще не было создано, то создать
        if( _mathWindow.isNull() ) { 
            // this - указатель на главное окно приложения
            _mathWindow.reset(new mathwindow(this));
        }
        // Показать
        _mathWindow->show();
       
        // Грабануть
        _mathWindow->grabValue();
    }
private:
    Ui::MainWindow *ui;

    // Использование QScopedPointer обезопасит от утечек памяти
    QScopedPointer<mathwindow> _mathWindow;
};

mathwindow.h:

#include <QWidget>
#include "mainwindow.h"
    
namespace Ui {
    class mathwindow;
}
    
class mathwindow : public QWidget
{
    Q_OBJECT
    
public:
    explicit mathwindow(MainWindow* mainWindow, QWidget *parent = nullptr);
    ~mathwindow();
 public slots:
    void grabValue();
 private:
    Ui::mathwindow *ui;
    MainWindow* _mainWindow;
 };

mathwindow.cpp:

#include "mathwindow.h"

#include "ui_mathwindow.h"
#include <QDebug>

mathwindow::mathwindow(MainWindow* mainWindow, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::mathwindow),
    _mainWindow(mainWindow)
{
    ui->setupUi(this);
    
}

mathwindow::~mathwindow()
{
    delete ui;
}

void mathwindow::grabValue() {
    qDebug() << "OPENED!!";
}
→ Ссылка