Как в qt передать текст из одного окна в другое с помощью механизма сигналов и слотов?

Я пытался реализовать это через указатели: все работало.
С меня преподаватель требует сделать это через механизм сигналов и слотов.
А я хоть убей, но не понимаю, как это сделать, по крайней мере, как передать текст из окна в окно (сделал вызов второго по кнопке).
Нужно во втором окне выводить в label "Приветствую вас, +введенное имя из 1 окна. Помогите, пожалуйста.
В редакторе в первом окне кнопка и lineedit, а во втором label

Код:
anotherwindow.h

  1. #ifndef ANOTHERWINDOW_H
  2. #define ANOTHERWINDOW_H
  3.  
  4. #include <QDialog>
  5. #include <QString>
  6.  
  7. namespace Ui {
  8. class anotherWindow;
  9. }
  10.  
  11. class anotherWindow : public QDialog
  12. {
  13. Q_OBJECT
  14.  
  15. public:
  16. explicit anotherWindow(QWidget *parent = nullptr);
  17. ~anotherWindow();
  18.  
  19. private:
  20. Ui::anotherWindow *ui;
  21. };
  22.  
  23.  
  24.  
  25. #endif // ANOTHERWINDOW_H

mainwindow.h

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3.  
  4. #include <QMainWindow>
  5. #include "anotherwindow.h"
  6. #include <QDialog>
  7.  
  8. QT_BEGIN_NAMESPACE
  9. namespace Ui { class MainWindow; }
  10. QT_END_NAMESPACE
  11.  
  12. class MainWindow : public QMainWindow
  13. {
  14. Q_OBJECT
  15.  
  16. public:
  17. MainWindow(QWidget *parent = nullptr);
  18. ~MainWindow();
  19.  
  20. // И создадим указатель на нашу будущую форму:
  21.  
  22. private slots:
  23. void on_pushButton_clicked();
  24.  
  25. private:
  26. anotherWindow *my2window;
  27.  
  28. private:
  29. Ui::MainWindow *ui;
  30. };
  31.  
  32.  
  33. #endif // MAINWINDOW_H
  34.  

anotherwindow.cpp

  1. #include "anotherwindow.h"
  2. #include "ui_anotherwindow.h"
  3.  
  4.  
  5. anotherWindow::anotherWindow(QWidget *parent) :
  6. QDialog(parent),
  7. ui(new Ui::anotherWindow)
  8. {
  9. ui->setupUi(this);
  10. }
  11.  
  12. //void anotherWindow::recieveData(QString)
  13. //{
  14. //ui->label->setText;
  15. //}
  16.  
  17. anotherWindow::~anotherWindow()
  18. {
  19. delete ui;
  20. }
  21. //anotherWindow
  22.  

main cpp не тронуто

mainwindow.cpp

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3.  
  4. MainWindow::MainWindow(QWidget *parent)
  5. : QMainWindow(parent)
  6. , ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. my2window = new anotherWindow(); // создаем нашу форму
  10. }
  11. MainWindow::~MainWindow()
  12. {
  13. delete ui;
  14. }
  15.  
  16.  
  17. void MainWindow::on_pushButton_clicked()
  18. {
  19. connect(ui->pushButton, SIGNAL(clicked()), my2window, SLOT(show())); // подключаем сигнал к слоту
  20. }
3

Do you like it? Share on social networks!

3
Алексей Внуков
  • May 14, 2021, 12:01 p.m.

давайте начнем с того что так писать коннект уже давно не верно,нужно

  1. connect(this,&MainWindow::sig_set_text,my2window,&anotherWindow::recieveData);

сам коннект нужно написать там где создается экземпляр второго окна (в вашем случае в конструкторе главного окна), естественно вам нужно добавить в хедер основного окна сигнал который будет передавть текст по нажатию кнопки

  1. void sig_set_text(QString);

после пропишите вызов сигнала в слоте нажатия кнопки, и дальше уже показываете окно с текстом

    U
    • May 14, 2021, 1:28 p.m.
    • (edited)

    Сигналы-слоты нужны, чтобы обмениваться информацией между классами.

    1) Нужно создать сигнал и указать, какую инфу он будет слать. Для этого в маинвиндоу.h пишем

    1. private slots: //взял этот кусок, чтобы Вы понимали, где вставлять описание сигнала
    2. void on_pushButton_clicked();
    3.  
    4. signals:
    5. void mySignal(const QString &text); //название сигнала потом сами пропишите

    2) Создаем слот, который будет вызываться в ответ сигналу. Для этого в энозервиндоу.h пишем:

    1. private:
    2. Ui::anotherWindow *ui;
    3.  
    4. public slots:
    5. void mySlot(const QString &text);

    3) Описываем, чо этот слот делает. Для этого в энозервиндоу.cpp:

    1. void anotherWindow::mySlot(const QString &text)
    2. {
    3. QString resultString = "Я тут чет хотел написать... А в слот мне прилетело: " + text;
    4. ui->label->setText(resultString);
    5. }

    4) Теперь надо "соединить сигнал со слотом". В том месте, где создается экземпляр энозервиндоу, нужно сказать "ГОРШОЧЕК ВАРИ, КОГДА УСЛЫШИШЬ НУЖНЫЙ СИГНАЛ":

    1. MainWindow::MainWindow(QWidget *parent)
    2. : QMainWindow(parent)
    3. , ui(new Ui::MainWindow)
    4. {
    5. ui->setupUi(this);
    6. my2window = new anotherWindow(); // создаем нашу форму
    7. connect(this, SIGNAL(mySignal(const QString &)), my2window, SLOT(mySlot(const QString &)));
    8. }

    5) А теперь испускаем сигнал в том месте, где хотим (те при нажатии на кнопку в маинвидоу):

    1. void MainWindow::on_pushButton_clicked()
    2. {
    3. emit mySignal(ui->lineedit->text()); //вызывая сигнал нужно в скобочках указать текст, который мы передаем другому классу, и если я правильно понял - это текст из лайнедита.
    4. }

    Ник Виктория, а повествование ведется от мужского лица... Провели меня, эх провели(

      U
      • May 14, 2021, 2:04 p.m.
      • (edited)

      К слову сказать... Хоть это и не относится к теме вопроса, но коли Вы студент и в указателях вроде как разбирались... Укажу на косяк)

      1. my2window = new anotherWindow();

      В рамках Вашего маленького проекта это не критично, но на будущее учтите, что каждый созданный с помощью new объект нужно удалить!
      У Вас my2window - это указатель. При уничтожении класса, в котором содержится указатель - удалится сам указатель, но НЕ объект, на который он указывает. И это важно!!!

      Чтобы удалить объект, на который ссылается указатель, нужно в деструкторе маинвиндоу написать delete my2window!

      P.s. хотя повторюсь) в Вашем конкретном примере это не критично, тк экзмепляр всего один... А вот если бы было много разных штук, которые еще содержали указатели на другие штуки... И все это создавалось и удалялось динамически по мере работы - в конечном итоге у Вас в программе наплодилось куча всяких my2win-ов, указатели на них Вы поудаляли, а сами my2win-ы продолжили существовать в оперативке компа)

        Comments

        Only authorized users can post comments.
        Please, Log in or Sign up
        • Last comments
        • AK
          April 1, 2025, 11:41 a.m.
          Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
        • Evgenii Legotckoi
          March 9, 2025, 9:02 p.m.
          К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
        • VP
          March 9, 2025, 4:14 p.m.
          Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
        • ИМ
          Nov. 22, 2024, 9:51 p.m.
          Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        • Evgenii Legotckoi
          Oct. 31, 2024, 11:37 p.m.
          Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup