ВД
Виктория ДроноваМамыр 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-ы продолжили существовать в оперативке компа)

        Пікірлер

        Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
        Кіріңіз немесе Тіркеліңіз
        OI
        • Ora Iro
        • Жел. 24, 2024, 6:38 Т.Ж.

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

        • Нәтиже:40ұпай,
        • Бағалау ұпайлары-8
        AD

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Нәтиже:50ұпай,
        • Бағалау ұпайлары-4
        m
        • molni99
        • Қаз. 26, 2024, 1:37 Т.Ж.

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Нәтиже:80ұпай,
        • Бағалау ұпайлары4
        Соңғы пікірлер
        ИМ
        Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
        Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        Evgenii Legotckoi
        Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
        Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
        A
        ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
        Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
        ИМ
        Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
        Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
        d
        dblas5Шілде 5, 2024, 11:02 Т.Ж.
        QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        Енді форумда талқылаңыз
        Evgenii Legotckoi
        Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
        t
        tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
        google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
        NSProject
        NSProjectМаусым 4, 2022, 3:49 Т.Ж.
        Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
        9
        9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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