Почему по нажатию не выводится во втрое окно введенный текст?
Пользователь вводит своё имя в 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 шт):
Для начала разберитесь какие сигналы есть у виджетов и какие они имеют параметры, и далее в 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.: Пока не разобрались в том как это работает, не поленитесь и предварительно на листочке выпишите сигналы и слоты и стрелочками соедините как должно работать