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

Передача значения переменной из одной формы в другую

22.01.2016, 22:01. Показов 3522. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток Форумчане. Столкнулся с такой проблемой что мне нужно передать данные с одной формы на другую. Нашёл как это делается с помощью сигналов и слотов, но не очень понял как оно работает. Понял что по нажатию кнопки порождается сигнал который открывает дочернюю форму из которой введённые в неё данные возвращаются в форму вызова. Мне же нужно понять как сделать так чтобы данные передавались не в точку вызова, на наоборот. т.е. нажимаем кнопку, к кнопке прикручен код который вызывает форму и переменная с данными которые мы туда отсылаем.
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
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include <QtNetwork/QNetworkAccessManager>
#include <QDebug>
#include <QUrl>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QTextCodec>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{
   QNetworkAccessManager* manager= new QNetworkAccessManager(this);
   QByteArray Request;
   QUrl site("script обработчик"); // ссылка на скрипт обработчик
   QString Login= ui->lineEdit->text(); // берём введённые данные
   QString Password= ui->lineEdit_2->text();
 
   QByteArray postData; // собирает пост запрос
   postData+= "a=auth" ;
   postData+= "&";
   postData+= "user=" + QUrl::toPercentEncoding(Login.toUtf8() );
   postData+= "&";
   postData+= "password=" + QUrl::toPercentEncoding(Password.toUtf8() );
 
   QNetworkRequest request(site); // собирает пост запрос
   request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
 
 
   QNetworkReply* reply= manager->post(request, postData); // отправляем пост запрос
 
   connect (reply, SIGNAL(finished()),this, SLOT(replyFinished()));
}
 
MainWindow::replyFinished() // получаем ответ
{
    QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
    QByteArray content= reply->readAll();
    QTextCodec *codec = QTextCodec::codecForName("cp1251");
    QString Data= codec->toUnicode(content.data());
    ui->label->setText(Data);
    getText();
    Dialog *maine = new  Dialog();
    maine->show();
    close();
}
 
QString MainWindow::getText()
{
    return ui->label->text();
}
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
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
 
public:
    explicit MainWindow(QWidget *parent = 0);
    QString getText();
    ~MainWindow();
 
public slots:
    replyFinished();
private slots:
    void on_pushButton_clicked();
 
private:
    Ui::MainWindow *ui;
};
 
#endif // 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
 то куда должны приходить
dialog.cpp
 
#include "dialog.h"
#include "ui_dialog.h"
 
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}
 
void Dialog::slotAccepted()
{
    MainWindow* mainwindow = dynamic_cast<MainWindow*>(sender());
    QString Data = mainwindow->getText();
    ui->plainTextEdit->setPlainText(Data);
}
 
Dialog::~Dialog()
{
    delete ui;
}
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
dialog.h
 
#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
#include "mainwindow.h"
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
private slots:
    void slotAccepted();
private:
    Ui::Dialog *ui;
    MainWindow* mainwindow;
};
 
#endif // DIALOG_H
буду рад если подскажете как это можно сделать или приведите пример.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2016, 22:01
Ответы с готовыми решениями:

Передача значения переменной из формы в другую
Здравствуйте. Есть две формы: AW и CW. В форме AW есть переменная data типа QString. Данные в эту...

Передача данных с одной формы на другую
Всем привет. На одной форме расположено поле ввода и кнопка, по нажатию которой осуществляется...

Передача данных из одной формы в другую
Всем привет! Как передавать значения, например QComboBox из формы А в форму B?

Передать значение переменной из одной функции в другую
Добрый день, подскажите как передать значение t из одной функции в другую. из этой void...

8
72 / 72 / 33
Регистрация: 07.11.2015
Сообщений: 281
23.01.2016, 12:46 2
Если нужно из MainWindow::replyFinished() инициализировать Dialog, то проще передать нужные параметры в конструктор.
C++ (Qt)
1
2
3
4
5
6
7
Dialog::Dialog(const QString& data, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    ui->plainTextEdit->setPlainText(data);
}
C++ (Qt)
1
2
3
4
5
6
MainWindow::replyFinished() // получаем ответ
{
    ...
    Dialog *maine = new  Dialog(getText());
    ...
}
1
7 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 126
23.01.2016, 13:01  [ТС] 3
Цитата Сообщение от OneMoreGres Посмотреть сообщение
Если нужно из MainWindow::replyFinished() инициализировать Dialog, то проще передать нужные параметры в конструктор.
Нет, вы не поняли. Нужно если возможно данные которые получаются в replyFinished() передать в Dialog.
0
72 / 72 / 33
Регистрация: 07.11.2015
Сообщений: 281
23.01.2016, 13:11 4
Ну так передавайте эти данные
C++ (Qt)
1
Dialog::Dialog(const QByteArray& data, QWidget *parent)
C++ (Qt)
1
Dialog *maine = new  Dialog(reply->readAll());
Плюс оно и сейчас так и делается: полученные данные пишутся в label, а затем его значение передается в QDialog.
0
7 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 126
23.01.2016, 13:51  [ТС] 5
Цитата Сообщение от OneMoreGres Посмотреть сообщение
Плюс оно и сейчас так и делается: полученные данные пишутся в label, а затем его значение передается в QDialog.
Поставлю вопрос немного по другому. Если я вас правильно понял то
C++ (Qt)
1
2
3
4
QString MainWindow::getText()
{
    return ui->label->text();
}
передаёт данные, но я не понял как в dialog их получать.
0
7 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 126
23.01.2016, 14:18  [ТС] 6
Что не так ???
Миниатюры
Передача значения переменной из одной формы в другую   Передача значения переменной из одной формы в другую  
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
23.01.2016, 22:57 7
У вас в конструкторе диалога передается два обязательных параметра - QByteArray& и QWidget* . При вызове конструктора эти поля не прописаны. Вместо них - пустые скобки конструктора по умолчанию, который не прописан. И зачем передавать ссылку на QByteArray?

И вообще, советую [URL=http://doc.qt.io/qt-5/qdialog.html]прочитать[\URL] как работать с диалогами.

C++ (Qt)
1
2
3
4
5
6
7
8
    if (!Dialog) {
            Dialog = new Dialog(MyQByteArray,this);
            //some connect maybe;
        }
    
    if (plisDialog->exec() == QDialog::Accepted){
        //Do Something; example: QByteArray someData = Dialog.someData
    }
0
72 / 72 / 33
Регистрация: 07.11.2015
Сообщений: 281
24.01.2016, 15:56 8
Лучший ответ Сообщение было отмечено Wolf_Lone как решение

Решение

Цитата Сообщение от Wolf_Lone Посмотреть сообщение
Если я вас правильно понял то ... передаёт данные, но я не понял как в dialog их получать
Передает он данные в коде, который я изначально предложил.

Если что, ни в одном куске кода (ни вашем, ни моем) для передачи информации не использовались сигналы и слоты. Соответственно тут действуют обычные правила С++.
getText() возвращает данные в код, который его вызвал (в вашем примере строчка 55 возвращает результат в никуда). Чтобы Dialog эти данные увидел, предлагается передавать их в конструкторе Dialog.
Dialog::slotAccepted() не выполняется, т.к. его никто не вызывает как метод (он, кстати, в этом случае упадет.. угадайте почему ) и он ни к кому не подключен как слот.

Если использовать сигналы/слоты не обязательно, то подправьте свой код под любое из моих предложений.
Если обязательно, то прочитайте про сигналы хотя бы тут. Потом добавьте сигнал, информирующий о наличии данных в MainWindow, слот, обрабатывающий эти данные, в Dialog, соедините их и испустите добавленный сигнал с нужными данными.
2
7 / 7 / 0
Регистрация: 08.10.2015
Сообщений: 126
26.01.2016, 12:48  [ТС] 9
Я вас понял, получилось примерно так. Функционал который требовался от кода выполняется.

Кликните здесь для просмотра всего текста

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
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
 
#include <QDialog>
#include "mainwindow.h"
 
namespace Ui {
class Dialog;
}
 
class Dialog : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog(const QString& data, QWidget *parent = 0);
    ~Dialog();
private slots:
   // void slotAccepted();
private:
    Ui::Dialog *ui;
    MainWindow* mainwindow;
};
 
#endif // 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
28
29
30
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
 
public:
    explicit MainWindow(QWidget *parent = 0);
    QString getText();
    ~MainWindow();
 
public slots:
    replyFinished();
private slots:
    void on_pushButton_clicked();
 
private:
    Ui::MainWindow *ui;
};
 
#endif // 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
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
 
Dialog::Dialog(const QString &data, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
 
    ui->plainTextEdit->setPlainText(data);
 
}
 
//void Dialog::slotAccepted()
//{
//    MainWindow* mainwindow = dynamic_cast<MainWindow*>(sender());
//    QString Data = mainwindow->getText();
//    ui->plainTextEdit->setPlainText(Data);
//}
 
Dialog::~Dialog()
{
    delete ui;
}
mainwondow.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
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include <QtNetwork/QNetworkAccessManager>
#include <QDebug>
#include <QUrl>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QTextCodec>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{
   QNetworkAccessManager* manager= new QNetworkAccessManager(this);
   QByteArray Request;
   QUrl site("http://site/script.php"); // ссылка на скрипт обработчик
   QString Login= ui->lineEdit->text(); // берём введённые данные
   QString Password= ui->lineEdit_2->text();
   QString Version= "Launcher Wolf v0.1"; // версия лаунчера
 
   QByteArray postData; // собирает пост запрос
   postData+= "a=auth" ;
   postData+= "&";
   postData+= "user=" + QUrl::toPercentEncoding(Login.toUtf8() );
   postData+= "&";
   postData+= "password=" + QUrl::toPercentEncoding(Password.toUtf8() );
 
   QNetworkRequest request(site); // собирает пост запрос
   request.setHeader(QNetworkRequest::UserAgentHeader, Version);
   request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
 
 
   QNetworkReply* reply= manager->post(request, postData); // отправляем пост запрос
 
   connect (reply, SIGNAL(finished()),this, SLOT(replyFinished()));
}
 
MainWindow::replyFinished() // получаем ответ
{
    QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
    QByteArray content= reply->readAll();
    QTextCodec *codec = QTextCodec::codecForName("cp1251");
    QString Data= codec->toUnicode(content.data());
//    ui->label->setText(Data);
//    getText();
    Dialog *maine = new  Dialog(Data);
    maine->show();
    close();
}

Тему можно считать закрытой
0
26.01.2016, 12:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.01.2016, 12:48
Помогаю со студенческими работами здесь

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

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

Вызов одной формы через другую.
В общем у меня очередной вопрос назрел)) Создал я еще один проект- диалоговое окно. Накидал на...

Как передавать данные от одной формы в другую ?
Как передавать данные из одной формы в другую ? Допустим, в одной форме заполняются эдиты и при...


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

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