Почему не передается сигнал во вторую форму?
Пишу программу на С++ в 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 шт):
Можно сделать вот так - здесь 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!!";
}