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

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

Код:
anotherwindow.h

#ifndef ANOTHERWINDOW_H
#define ANOTHERWINDOW_H

#include <QDialog>
#include <QString>

namespace Ui {
class anotherWindow;
}

class anotherWindow : public QDialog
{
    Q_OBJECT

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

private:
    Ui::anotherWindow *ui;
};



#endif // ANOTHERWINDOW_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "anotherwindow.h"
#include <QDialog>

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 on_pushButton_clicked();

private:
        anotherWindow *my2window;

private:
    Ui::MainWindow *ui;
};


#endif // MAINWINDOW_H

anotherwindow.cpp

#include "anotherwindow.h"
#include "ui_anotherwindow.h"


anotherWindow::anotherWindow(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::anotherWindow)
{
    ui->setupUi(this);
}

//void anotherWindow::recieveData(QString)
//{
//ui->label->setText;
//}

anotherWindow::~anotherWindow()
{
    delete ui;
}
//anotherWindow

main cpp не тронуто

mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    my2window = new anotherWindow(); // создаем нашу форму
}
MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
     connect(ui->pushButton, SIGNAL(clicked()), my2window, SLOT(show())); // подключаем сигнал к слоту
}
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

3

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

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

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

void sig_set_text(QString);

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

    U
    • 14. Mai 2021 03:28
    • (bearbeitet)

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

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

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

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

    private:
        Ui::anotherWindow *ui;
    
    public slots:
        void mySlot(const QString &text);
    

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

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

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

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

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

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

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

      U
      • 14. Mai 2021 04:04
      • (bearbeitet)

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

      my2window = new anotherWindow();
      

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

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

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

        Kommentare

        Nur autorisierte Benutzer können Kommentare posten.
        Bitte Anmelden oder Registrieren
        Letzte Kommentare
        A
        ALO1ZE19. Oktober 2024 08:19
        Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
        ИМ
        Игорь Максимов5. Oktober 2024 07:51
        Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
        d
        dblas55. Juli 2024 11:02
        QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        k
        kmssr8. Februar 2024 18:43
        Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
        Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
        Jetzt im Forum diskutieren
        J
        JacobFib17. Oktober 2024 03:27
        добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
        JW
        Jhon Wick1. Oktober 2024 15:52
        Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
        КГ
        Кирилл Гусарев27. September 2024 09:09
        Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
        F
        Fynjy22. Juli 2024 04:15
        при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

        Folgen Sie uns in sozialen Netzwerken