ВД
Виктория ДроноваМамыр 13, 2021, 7:46 Т.Ж.

Как в 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
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

3
Алексей Внуков
  • Мамыр 14, 2021, 2:01 Т.Ж.

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

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

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

void sig_set_text(QString);

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

    U
    • Мамыр 14, 2021, 3:28 Т.Ж.
    • (өңделген)

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

    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, 2021, 4:04 Т.Ж.
      • (өңделген)

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

      my2window = new anotherWindow();
      

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

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

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

        Пікірлер

        Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
        Кіріңіз немесе Тіркеліңіз
        Г

        C++ - Тест 001. Первая программа и типы данных

        • Нәтиже:66ұпай,
        • Бағалау ұпайлары-1
        t

        C++ - Тест 001. Первая программа и типы данных

        • Нәтиже:33ұпай,
        • Бағалау ұпайлары-10
        t

        Qt - Тест 001. Сигналы и слоты

        • Нәтиже:52ұпай,
        • Бағалау ұпайлары-4
        Соңғы пікірлер
        G
        GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
        Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
        d
        dblas5Шілде 5, 2024, 11:02 Т.Ж.
        QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        k
        kmssrАқп. 8, 2024, 6:43 Т.Қ.
        Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
        АК
        Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
        Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
        Енді форумда талқылаңыз
        Evgenii Legotckoi
        Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
        F
        FynjyШілде 22, 2024, 4:15 Т.Ж.
        при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
        BlinCT
        BlinCTМаусым 25, 2024, 1 Т.Ж.
        Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
        BlinCT
        BlinCTМамыр 5, 2024, 5:46 Т.Ж.
        Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
        Evgenii Legotckoi
        Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
        Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

        Бізді әлеуметтік желілерде бақылаңыз