Почему по нажатию не выводится во втрое окно введенный текст?

Пользователь вводит своё имя в QLineEdit и по нажатию кнопки открывается второе окно, где выводится в label приветствие пользователя и его имя. Реализовал вывод второго окна с помощью механизма сигналов и слотов, а вот на вывод текста в другое окно меня не хватило-не понимаю. Помогите, пожалуйста.

maimwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "secondwindow.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public slots:
    void test(QString text);
signals:
  void secondSignal(QString text);
  void mySig(QString text);

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    secondwindow *my2window;//экземпляр 2 класса
};
#endif // MAINWINDOW_H

secondwindow.h

#ifndef SECONDWINDOW_H
#define SECONDWINDOW_H

#include <QDialog>

namespace Ui {
class secondwindow;
}

class secondwindow : public QDialog
{
    Q_OBJECT

public:
    explicit secondwindow(QWidget *parent = nullptr);
    ~secondwindow();

signals:
    void openwindow();// Сигнал для первого окна на открытие

//пип
signals: // тут задаются сигнатуры сигналов
void mySig(QString text); // у нас сигнал называется mySig с параметром QString


public slots:
   void secondSlot (QString text);

private:
    Ui::secondwindow *ui;
};



#endif // SECONDWINDOW_H

main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    my2window = new secondwindow();//инициализация

    connect (my2window, &secondwindow::openwindow, this, &MainWindow::show); //на открытие

  //  connect(my2window, &secondwindow::openwindow, this,  &MainWindow::test);
    connect (ui->pushButton, SIGNAL(clicked()),  my2window, SLOT(test));
    connect(this, &MainWindow::secondSignal, my2window, &secondwindow:: secondSlot );
    connect (ui->lineEdit, SIGNAL(test()),  my2window, SLOT(secondSlot));
   // connect (ui->);
}


void MainWindow::test(QString)
{
//прописать ввод текста
 emit secondSignal(ui->lineEdit->text());
}


void MainWindow::on_pushButton_clicked()
{
    my2window->show();  // Показываем второе окно
        this->close();    // Закрываем основное окно
}

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

secondwindow.cpp

#include "secondwindow.h"
#include "mainwindow.h"
#include "ui_secondwindow.h"
#include <QMessageBox>
secondwindow::secondwindow(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::secondwindow)
{
    ui->setupUi(this);
connect(this,SIGNAL(mySig(QString)),this,SLOT(secondSlot(QString))); // привязываем сигнал этого объекта в слоту в этом же объекте
}


void secondwindow::secondSlot(QString text)
{
  ui->label->setText(text);

}


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


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

Автор решения: Sergey Tatarincev

Для начала разберитесь какие сигналы есть у виджетов и какие они имеют параметры, и далее в connect пропишите правильные сигнатуры слотов/сигналов. MOC позволяет много вольностей, из-за которых потом ничего работать не будет. смотрите вывод во время отладки.

Если кратко:

connect (ui->lineEdit, SIGNAL(test()),  my2window, SLOT(secondSlot));
...
connect (ui->pushButton, SIGNAL(clicked()),  my2window, SLOT(test));

При исполнении выдаст предупреждение вида:

QObject::connect: Parentheses expected, slot ....

Поскольку запись должна быть SLOT(secondSlot()) и SLOT(test())

Далее. Вы пытаетесь увязать сигналы без параметров со слотами у которых есть параметры. Т.е. у QPushButton есть сигнал не имеющий параметров clicked(), к которому вы пытаетесь привязать слот с паhаметром (по вашей сигнатуре это test(QString)). MOC на это также отреагирует руганью:

QObject::connect: Incompatible sender/receiver arguments

Обобщая вышесказанное. Слоты и сигналы должны иметь одинаковые параметры. В конструкциях connect необходимо указывать полную сигнатуру слотов/сигналов (qtcreator кстати вам это предлагает как автозавершение).

В общем и целом увязка сигналов-слотов должна получиться такая:

connect (ui->pushButton, SIGNAL(clicked()),  this, SLOT(test())); //слот test() БЕЗ ПАРАМЕТРОВ 
connect(this, SIGNAL(secondSignal(QString)), my2window, SLOT(secondSlot(QString)));

тогда connect в secondwindow не нужен (вы его сигнал даже не используете) поскольку сигнал главного окна соединен со слотом во втором окне минуя сигнал. Или же можете оставить этот connect, но в главном окне эмитить сигнал второго окна:

void MainWindow::test(QString)
{
 emit my2window->mySig(ui->lineEdit->text());
}

P.S.: Пока не разобрались в том как это работает, не поленитесь и предварительно на листочке выпишите сигналы и слоты и стрелочками соедините как должно работать

→ Ссылка