ВД
May 13, 2021, 5:46 p.m.
Как в 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())); // подключаем сигнал к слоту
- }
3
253
Do you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- МАApril 1, 2025, 4:21 p.m.0ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
давайте начнем с того что так писать коннект уже давно не верно,нужно
сам коннект нужно написать там где создается экземпляр второго окна (в вашем случае в конструкторе главного окна), естественно вам нужно добавить в хедер основного окна сигнал который будет передавть текст по нажатию кнопки
после пропишите вызов сигнала в слоте нажатия кнопки, и дальше уже показываете окно с текстом
Сигналы-слоты нужны, чтобы обмениваться информацией между классами.
1) Нужно создать сигнал и указать, какую инфу он будет слать. Для этого в маинвиндоу.h пишем
2) Создаем слот, который будет вызываться в ответ сигналу. Для этого в энозервиндоу.h пишем:
3) Описываем, чо этот слот делает. Для этого в энозервиндоу.cpp:
4) Теперь надо "соединить сигнал со слотом". В том месте, где создается экземпляр энозервиндоу, нужно сказать "ГОРШОЧЕК ВАРИ, КОГДА УСЛЫШИШЬ НУЖНЫЙ СИГНАЛ":
5) А теперь испускаем сигнал в том месте, где хотим (те при нажатии на кнопку в маинвидоу):
Ник Виктория, а повествование ведется от мужского лица... Провели меня, эх провели(
К слову сказать... Хоть это и не относится к теме вопроса, но коли Вы студент и в указателях вроде как разбирались... Укажу на косяк)
В рамках Вашего маленького проекта это не критично, но на будущее учтите, что каждый созданный с помощью new объект нужно удалить!
У Вас my2window - это указатель. При уничтожении класса, в котором содержится указатель - удалится сам указатель, но НЕ объект, на который он указывает. И это важно!!!
Чтобы удалить объект, на который ссылается указатель, нужно в деструкторе маинвиндоу написать delete my2window!
P.s. хотя повторюсь) в Вашем конкретном примере это не критично, тк экзмепляр всего один... А вот если бы было много разных штук, которые еще содержали указатели на другие штуки... И все это создавалось и удалялось динамически по мере работы - в конечном итоге у Вас в программе наплодилось куча всяких my2win-ов, указатели на них Вы поудаляли, а сами my2win-ы продолжили существовать в оперативке компа)