Как в 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())); // подключаем сигнал к слоту }
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 12, 2024, 1:58 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 11:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 11:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
давайте начнем с того что так писать коннект уже давно не верно,нужно
сам коннект нужно написать там где создается экземпляр второго окна (в вашем случае в конструкторе главного окна), естественно вам нужно добавить в хедер основного окна сигнал который будет передавть текст по нажатию кнопки
после пропишите вызов сигнала в слоте нажатия кнопки, и дальше уже показываете окно с текстом
Сигналы-слоты нужны, чтобы обмениваться информацией между классами.
1) Нужно создать сигнал и указать, какую инфу он будет слать. Для этого в маинвиндоу.h пишем
2) Создаем слот, который будет вызываться в ответ сигналу. Для этого в энозервиндоу.h пишем:
3) Описываем, чо этот слот делает. Для этого в энозервиндоу.cpp:
4) Теперь надо "соединить сигнал со слотом". В том месте, где создается экземпляр энозервиндоу, нужно сказать "ГОРШОЧЕК ВАРИ, КОГДА УСЛЫШИШЬ НУЖНЫЙ СИГНАЛ":
5) А теперь испускаем сигнал в том месте, где хотим (те при нажатии на кнопку в маинвидоу):
Ник Виктория, а повествование ведется от мужского лица... Провели меня, эх провели(
К слову сказать... Хоть это и не относится к теме вопроса, но коли Вы студент и в указателях вроде как разбирались... Укажу на косяк)
В рамках Вашего маленького проекта это не критично, но на будущее учтите, что каждый созданный с помощью new объект нужно удалить!
У Вас my2window - это указатель. При уничтожении класса, в котором содержится указатель - удалится сам указатель, но НЕ объект, на который он указывает. И это важно!!!
Чтобы удалить объект, на который ссылается указатель, нужно в деструкторе маинвиндоу написать delete my2window!
P.s. хотя повторюсь) в Вашем конкретном примере это не критично, тк экзмепляр всего один... А вот если бы было много разных штук, которые еще содержали указатели на другие штуки... И все это создавалось и удалялось динамически по мере работы - в конечном итоге у Вас в программе наплодилось куча всяких my2win-ов, указатели на них Вы поудаляли, а сами my2win-ы продолжили существовать в оперативке компа)