Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
-9 / 1 / 0
Регистрация: 25.04.2015
Сообщений: 101
1

Отправка данных из дочерней формы(программно созданной) в главную форму

12.02.2019, 20:21. Показов 3273. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. Проблема в следующем: создал программно форму с двумя полями ввода и двумя кнопками.
Для второй кнопки "Закрыть" смог сделать закрытие формы без проблем:
C++ (Qt)
1
connect(Button2, SIGNAL(clicked()), form2, SLOT(close()));
А вот для первой кнопки не могу отправить данные и полей ввода form2 в главную форму. Искал способы через connect, но находил как из главной отправить в дочернюю форму, посредством создания сигнала в главной форме emit sendData() ...
Аналогичным образом я бы мог из дочерней отправить, но она программно создана, т.е. как ей сделать слот (если нужно)?
В общем нужно наиболее оптимальное решение данной проблемы.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2019, 20:21
Ответы с готовыми решениями:

Передача данных из дочерней формы в главную
Доброе времени суток! Сразу к сути проблемы. Имею две формы дочернюю и родительскую. В дочерней...

Передача данных из дочерней формы в главную
Хочу сделать "защиту от дурака": сделать неактивными другие кнопки верхнего меню до открытия...

Показать главную форму из дочерней не создавая новый объект
Доброго времени суток. Столкнулся с проблемой. Допустим, при запуске приложения открывается...

Сделать главную форму дочерней формой другого окна
Я делаю чит для видеоигры и мне бы хотелось что-бы в игре при нажатии клавиши моя форма появлялась...

8
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
12.02.2019, 22:05 2
Слот создаёшь в хедере главной формы, и коннектишь с сигналом в конструкторе главной формы. Там нужно в проекте правильно вторую форму добавить, что-бы они друг друга видели.
0
223 / 188 / 97
Регистрация: 15.04.2018
Сообщений: 718
12.02.2019, 22:17 3
Дочернюю наследуешь от QDialog / QWidget / QMainWindow

Прописываешь сигнал

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyClass : public QDialog
{
//конструкторы, деструкторы, ваши методы и т.д.
 
void testFunc()
{
    //в этом месте решаем вернуть данные
    emit sendData(1, "aaaaa");
}
 
signals:
 
void sendData(int a, QString b);
 
}
Коннект, как видно из вашего примера вы уже умеете делать. Создаете родителя и дочку, прописываете сиграл дочки к слоту родителя и запускаете дочку, чтобы она отослала сигнал, который обработается родителем
0
-9 / 1 / 0
Регистрация: 25.04.2015
Сообщений: 101
12.02.2019, 23:23  [ТС] 4
Цитата Сообщение от alexu_007 Посмотреть сообщение
Слот создаёшь в хедере главной формы, и коннектишь с сигналом в конструкторе главной формы.
Можно пример пожалуйста?
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
12.02.2019, 23:35 5
form1.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#ifndef FORM1_H
#define FORM1_H
 
#include <QWidget>
#include "form2.h"
 
 
namespace Ui {
class form1;
}
 
class form1 : public QWidget
{
    Q_OBJECT
    
public:
    explicit form1(QWidget *parent = 0);
    ~form1();
 
    Form2 *f2;
    
private:
    Ui::form1 *ui;
 
signals:
    void sendData_f1(QString);
 
public slots:
    void press_pbtn_f1_show();
    void press_pbtn_f1_hide();
    void press_pbtn_f1_01();
    void recieveData_f1(QString);
};
 
#endif // FORM1_H
form2.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#ifndef FORM2_H
#define FORM2_H
 
#include <QWidget>
//#include "form1.h"
 
 
namespace Ui {
class Form2;
}
 
class Form2 : public QWidget
{
    Q_OBJECT
    
public:
    explicit Form2(QWidget *parent = 0);
    ~Form2();
    
private:
    Ui::Form2 *ui;
 
signals:
    void sendData_f2(QString);
 
public slots:
    void press_pbtn_f2_04();
    void recieveData_f2(QString);
 
};
 
#endif // FORM2_H
form1.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "form1.h"
#include "ui_form1.h"
 
 
form1::form1(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::form1)
{
    ui->setupUi(this);
 
    f2 = new Form2;
 
    QObject::connect(ui->pbtn_f1_show,SIGNAL(clicked()),this,SLOT(press_pbtn_f1_show()));
    QObject::connect(ui->pbtn_f1_hide,SIGNAL(clicked()),this,SLOT(press_pbtn_f1_hide()));
 
    QObject::connect(ui->pbtn_f1_01,SIGNAL(clicked()),this,SLOT(press_pbtn_f1_01()));
    QObject::connect(ui->pbtn_f1_02,SIGNAL(clicked()),this,SLOT(press_pbtn_f1_01()));
    QObject::connect(ui->pbtn_f1_03,SIGNAL(clicked()),this,SLOT(press_pbtn_f1_01()));
 
    QObject::connect(this, SIGNAL(sendData_f1(QString)), f2, SLOT(recieveData_f2(QString)));
    QObject::connect(f2, SIGNAL(sendData_f2(QString)), this, SLOT(recieveData_f1(QString)));
}
 
 
 
 
form1::~form1()
{
    delete ui;
}
 
 
 
 
void form1::press_pbtn_f1_show()
{
    f2->show();
}
 
 
 
 
void form1::press_pbtn_f1_hide()
{
    f2->hide();
}
 
 
 
 
void form1::press_pbtn_f1_01()
{
    QString str = sender()->objectName();
            str = str.remove(0, 9);
 
    emit sendData_f1(str);
}
 
 
 
void form1::recieveData_f1(QString str)
{
    ui->label->setText(str);
}
form2.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "form2.h"
#include "ui_form2.h"
 
 
 
Form2::Form2(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form2)
{
    ui->setupUi(this);
 
    QObject::connect(ui->pbtn_f2_04,SIGNAL(clicked()),this,SLOT(press_pbtn_f2_04()));
    QObject::connect(ui->pbtn_f2_05,SIGNAL(clicked()),this,SLOT(press_pbtn_f2_04()));
    QObject::connect(ui->pbtn_f2_06,SIGNAL(clicked()),this,SLOT(press_pbtn_f2_04()));
}
 
 
 
 
Form2::~Form2()
{
    delete ui;
}
 
 
 
 
 
void Form2::press_pbtn_f2_04()
{
    QString str = sender()->objectName();
            str = str.remove(0, 9);
 
    emit sendData_f2(str);
}
 
 
 
 
void Form2::recieveData_f2(QString str)
{
    ui->label->setText(str);
}
1
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
12.02.2019, 23:46 6
Скрин экрана:
Миниатюры
Отправка данных из дочерней формы(программно созданной) в главную форму  
0
-9 / 1 / 0
Регистрация: 25.04.2015
Сообщений: 101
14.02.2019, 15:33  [ТС] 7
Это все конечно хорошо, спасибо за старания, но у меня форма создается программно в коде form1.cpp, т.е. у form2 нет хедера, чтобы там писать сигналы и слоты

Добавлено через 11 минут
Создаю форму 2 таким образом:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
QMainWindow *w=new QMainWindow(this);
//Добавляем подписи
    QLabel *titleLabel=new QLabel("Заголовок новости:");
    QLabel *dateLabel=new QLabel("Дата публикации:");
    QLabel *contentLabel=new QLabel("Текст новости:");
 
    //добавляем текстовые поля и кнопку
    QLineEdit *titleEdit=new QLineEdit();
    QDateEdit *dateEdit=new QDateEdit();
    QTextEdit *contentEdit=new QTextEdit();
    QPushButton *confirmButton=new QPushButton("Опубликовать");
    QPushButton *Button2=new QPushButton("Закрыть");
 
    //вертикальное размещение для заголовка
    QLayout *titleLayout=new QVBoxLayout();
    titleLayout->addWidget(titleLabel);
    titleLayout->addWidget(titleEdit);
 
    //вертикальное размещение для даты
    QLayout *dateLayout=new QVBoxLayout();
    dateLayout->addWidget(dateLabel);
    dateLayout->addWidget(dateEdit);
 
    //горизонтальное размещение для даты и заголовка
    QLayout *titleAndDateLayout=new QHBoxLayout();
    titleAndDateLayout->addItem(titleLayout);
    titleAndDateLayout->setSpacing(10);
    titleAndDateLayout->addItem(dateLayout);
 
    //вертикальное размещение для всех виджетов
    QLayout *contentLayout=new QVBoxLayout();
    contentLayout->addWidget(contentLabel);
    contentLayout->addWidget(contentEdit);
    contentLayout->setSpacing(10);
    contentLayout->addWidget(confirmButton);
    contentLayout->addWidget(Button2);
 
    QLayout *allLayout=new QVBoxLayout();
    allLayout->addItem(titleAndDateLayout);
    allLayout->addItem(contentLayout);
 
 
    QWidget *centralWidget=new QWidget();
    centralWidget->setLayout(allLayout);
    this->setCentralWidget(centralWidget);
    connect(Button2, SIGNAL(clicked()), w, SLOT(close()));
 
w->show();
0
683 / 458 / 160
Регистрация: 01.10.2015
Сообщений: 1,264
14.02.2019, 17:51 8
Лучший ответ Сообщение было отмечено AkulPavel как решение

Решение

QMainWindow - главное окно, оно должно быть в единственном экземпляре. Это каркас/контейнер для типовых элементов программы - панель меню, статус-бар, панели инструментов, и т.д. Чтобы не "лепить" стандартные конструкции каждый раз, Qt предоставляет вам соответствующую заготовку. Второго "Главного Окна" не должно быть по определению, но именно это вы делаете первой же строкой.

Цитата Сообщение от AkulPavel Посмотреть сообщение
чтобы там писать сигналы и слоты
Заголовочный файл понадобится, если вы определяете собственные сигналы/слоты, т.е. при описании наследника. Расширить функциональность можно не только при помощи наследования. Если динамическое конструирование формы является настолько критичным условием, то во многих случаях можно обойтись и предопределенными сигналами, а реакцию на получение, например, прописать в лямбдах.

forms.zip
1
-9 / 1 / 0
Регистрация: 25.04.2015
Сообщений: 101
15.02.2019, 23:32  [ТС] 9
Цитата Сообщение от 0x90h Посмотреть сообщение
QMainWindow - главное окно, оно должно быть в единственном экземпляре. Это каркас/контейнер для типовых элементов программы - панель меню, статус-бар, панели инструментов, и т.д. Чтобы не "лепить" стандартные конструкции каждый раз, Qt предоставляет вам соответствующую заготовку. Второго "Главного Окна" не должно быть по определению, но именно это вы делаете первой же строкой.
Согласен, думал об этом потом исправить, просто увидел такое в примере

Добавлено через 32 минуты
0x90h, Огромное спасибище
0
15.02.2019, 23:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2019, 23:32
Помогаю со студенческими работами здесь

Вывод из дочерней формы в главную
Есть две формы, форма1(Главная) и форма2(Побочная, которую вызываю из главной). Так вот, при по...

Qt передача данных из модальной формы в главную форму диалога
Не получается реализовать передачу данных из модальной формы при ее закрытие в главную форму...

Передача исключения из дочерней формы в главную
Всем привет! Простая программа: первая форма с кнопкой. По нажатию на кнопку создается вторая...

Как передать текст из дочерней формы в главную?
У меня есть форма 1 и 2. При нажатии на кнопку первой формы, я открываю вторую форму, где прошу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru