ВД
Виктория Дронова13 мая 2021 г. 17: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 г. 12:01

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

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

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

void sig_set_text(QString);

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

    U
    • 14 мая 2021 г. 13: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 г. 14:04
      • (ред.)

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

      my2window = new anotherWindow();
      

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

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

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

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь
        Ua

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

        • Результат:84баллов,
        • Очки рейтинга4
        Ua

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

        • Результат:42баллов,
        • Очки рейтинга-8
        ОК

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

        • Результат:47баллов,
        • Очки рейтинга-6
        Последние комментарии
        ИМ
        Игорь Максимов22 ноября 2024 г. 21:51
        Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        Evgenii Legotckoi
        Evgenii Legotckoi31 октября 2024 г. 23:37
        Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
        A
        ALO1ZE19 октября 2024 г. 17:19
        Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
        ИМ
        Игорь Максимов5 октября 2024 г. 16:51
        Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
        d
        dblas55 июля 2024 г. 20:02
        QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        Сейчас обсуждают на форуме
        f
        firstlunoxod15 февраля 2025 г. 13:46
        Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
        Дмитрий
        Дмитрий3 февраля 2025 г. 16:24
        Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
        NW
        Nayo Wai30 января 2025 г. 19:22
        не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
        n
        nkly3 января 2025 г. 12:52
        Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
        M
        Marsel17 августа 2023 г. 0:26
        OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

        Следите за нами в социальных сетях