0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 51
1

Передача данных из второго окна в главное окно

19.08.2016, 06:31. Показов 4310. Ответов 8
Метки нет (Все метки)

Добрый день!

Передаю данные из главного окна во второе окно:
C++ (Qt)
1
2
3
4
    myform = new Dialog();
    connect(ui->pushButton_2, SIGNAL(clicked()), myform, SLOT(show()));
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(onButtonSend()));
    connect(this, SIGNAL(sendData(qreal,int)), myform, SLOT(recieveData(qreal, int)));
А как передать эти же данные обратно из второго окна в главное окно? Пытаюсь так (код в mainwindow.cpp):
C++ (Qt)
1
connect(myform, SIGNAL(sendData_rev(qreal,int)), this, SLOT(recieveData_rev(qreal,int)));
Qt не ругается на то, что нет слота и сигнала, но и передача не работает.

Спасибо
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2016, 06:31
Ответы с готовыми решениями:

Главное окно скрыто... как развернуть все Второстепенные окна после сворачивания(разворачивается только главное невидимое
Главное окно скрыто... как развернуть все Второстепенные окна после сворачивания(разворачивается...

Создать окно поверх главного окна, чтобы главное окно было доступно
здравствуйте. подскажите пожалуйста как сделать окно поверх главного окна, но чтобы главное окно...

Qt. Не могу перейти с окна с StackedWidjets на главное окно
В общем проблема состоит в том что я не могу перейти с окна task_for_11class на hellowindow. пишет...

Вывод переменных из Диалогового Окна в главное окно
В общем задача такая, нужно создавать главное вин окно, по нажатию на пункт меню вызывать...

8
7031 / 6054 / 2751
Регистрация: 14.04.2014
Сообщений: 25,922
19.08.2016, 09:15 2
Так они есть или нет?
0
479 / 454 / 73
Регистрация: 29.05.2015
Сообщений: 3,019
19.08.2016, 09:37 3
Как вариант, программа не доходит до отправления сигнала, он и не отправляется.
0
92 / 92 / 33
Регистрация: 17.03.2012
Сообщений: 536
19.08.2016, 10:46 4
Надо больше кода, так не понятно
0
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 51
19.08.2016, 14:29  [ТС] 5
При компиляции предупреждения об отсутствующих сигналах/слотах не выводятся.
Вот пример кода (две формы, на каждой по 2 спинбокса и кнопка):

dialog.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
#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
 
private:
    Ui::Dialog *ui;
 
signals:
    void sendData_rev(qreal m, int n);
private slots:
    void onButtonSend();
};
 
#endif // DIALOG_H
mainwindow.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
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include "dialog.h"
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
public slots:
    void recieveData_rev(qreal m, int n);
 
private:
    Ui::MainWindow *ui;
    Dialog *myform;
};
 
#endif // MAINWINDOW_H
dialog.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "dialog.h"
#include "ui_dialog.h"
 
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}
 
Dialog::~Dialog()
{
    delete ui;
}
void Dialog::onButtonSend()
{
    emit sendData_rev(ui->doubleSpinBox->value(), ui->spinBox->value());
}
mainwindow.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
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    myform = new Dialog();
    connect(ui->pushButton, SIGNAL(clicked()), myform, SLOT(show()));
    connect(ui->pushButton, SIGNAL(clicked()), myform, SLOT(onButtonSend()));
    connect(myform, SIGNAL(sendData_rev(qreal,int)), this, SLOT(recieveData_rev(qreal,int)));
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::recieveData_rev(qreal m, int n)
{
    ui->doubleSpinBox->setValue(m);
    ui->spinBox->setValue(n);
}
0
183 / 175 / 57
Регистрация: 25.09.2014
Сообщений: 828
19.08.2016, 15:05 6
Лучший ответ Сообщение было отмечено айвора как решение

Решение

private slots:
void onButtonSend();

Приватный. Может вызываться как функция из объектов этого же класса. И только. Сделай публичным.
1
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 51
19.08.2016, 17:00  [ТС] 7
Горбаг, спасибо большое, помогло. Теперь данные передаются.

Но попутно вылезла ошибка в логике - в главное окно данные передаются не по нажатию кнопки во втором окне, а при нажатии кнопки в главном окне. Я так понимаю, что проблема в этой строке:
C++ (Qt)
1
connect(ui->pushButton, SIGNAL(clicked()), myform, SLOT(onButtonSend()));
но если я меняю ui->pushButton на myform, то не могу обратиться через стрелку к кнопке во втором окне, как следствие, компилятор пишет что нет сигнала.

Подскажите, как правильно сделать?
0
183 / 175 / 57
Регистрация: 25.09.2014
Сообщений: 828
19.08.2016, 17:44 8
Лучший ответ Сообщение было отмечено айвора как решение

Решение

Ну так у тебя в первых приведенных тобой файлах Форма1 отправляет сигнал при нажатии на кнопку, а вот со 2 формы СРАЗУ ЖЕ при получении сигнала (сработал слот и выполнилось его содержимое) эти данные возвращаются в 1 форму (так как содержимое слота - ответный сигнал).

Тебе их надо при получении в форме диалога сохранить куда-нибудь. И только затем при нажатии кнопки на форме2 отправлять.

То есть ты должен испускать сигнал (emit ...) не прямо в слоте диалога, а в функции нажатия на кнопку.
А сам коннект сделан абсолютно верно:
C++ (Qt)
1
connect(myform, SIGNAL(sendData_rev(qreal,int)), this, SLOT(recieveData_rev(qreal,int)));
Добавлено через 25 минут
Это убери:
C++ (Qt)
1
connect(ui->pushButton, SIGNAL(clicked()), myform, SLOT(onButtonSend())); //нарушает логику работы, которую ты задумал
добавь в h майна:
C++ (Qt)
1
2
3
4
private slots:
void onSendData();
signals:
void sendData(qreal,int);
добавь в срр майна:
C++ (Qt)
1
2
3
4
5
6
7
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onSendData())); //в конструктор
connect(this,SIGNAL(sendData(qreal,int)),dialog,SLOT(onReceiveData(qreal,int))); //в конструктор
 
void MainWindow::onSendData() //этот слот вызывается при нажатии на кнопку. Когда он вызвался, он в своем теле вызывает сигнал передачи данных. Этот сигнал будет пойман слотом диалога. Там нужно сохранить данные. И по кнопке их вернуть (реализация кнопки аналогична кнопке майна)
{
emit sendData( ui->doubleSpinBox->value(), ui->spinBox->value() ); //тут особо не задумывался, суть в том, что мы достаем значения и их передаем, я мог накосячить с методами доставания данных
}
в диалоге:
хедер:
C++ (Qt)
1
2
qreal savedOne;
int savedTwo;
в cpp
в конструкторе
C++ (Qt)
1
2
3
savedOne = 0.0;
savedTwo = -1;
 connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onButtonSend()));
ниже
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
void Dialog::onReceiveData(qreal one,int two) //в слоте сохраняешь принятые данные в переменные этого класса
{
savedOne = one;
savedTwo = two;
}
 
 
void Dialog::onButtonSend() //в слоте, который выполнится по нажатия на кнопку, ты эти данные отправляешь обратно
{
emit sendData_rev(savedOne, savedTwo)
}
Писал бегло, извиняй. Общий смысл должен быть понятен.
1
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 51
20.08.2016, 06:01  [ТС] 9
Горбаг, спасибо огромное, чуть допилил и все работает - и туда, и обратно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2016, 06:01

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

Передать сигнал из диалогового окна с номером N в главное окно
Если описать полную конструкцию то получится. При старте попадаем в главное окно ---&gt; диалоговое...

При закрытии дочернего окна закрывается еще и главное окно
#include &lt;Windows.h&gt;//подключение winAPI #include &lt;tchar.h&gt; HWND hChildWnd1; HWND hButton1;...

При закрытии дочернего окна, главное окно переходит на задний план
При закрытии дочернего окна, главное окно переходит на задний план. Открываю и закрываю окна самым...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.