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

Обмен данными между 2 GUI приложениями Qt

25.07.2017, 15:51. Показов 14086. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер, господа форумчане.
Реализовываю межпроцессорное взаимодействие 2 GUI приложений.

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
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include <QProcess>
 
namespace Ui 
{
    class Widget;
}
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
 
private:
    Ui::Widget *ui;
    QProcess* process;
    QString log;
    void addToLog(QString str);
 
private slots:
    void slotDataOnStdout();
    void slotStartedProcess();
    void slotFineshedProcess(int k);
    void on_btnStart_clicked();
    void on_btnWrite_clicked();
};
 
#endif // WIDGET_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
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 "widget.h"
#include "ui_widget.h"
#include <QtCore>
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
 
    process = new QProcess(this);
 
    connect(process, SIGNAL(readyReadStandardOutput()),this, SLOT(slotDataOnStdout()));
    connect(process, SIGNAL(started()), this, SLOT(slotStartedProcess()));
    connect(process, SIGNAL(finished(int)), this, SLOT(slotFineshedProcess(int)));
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::addToLog(QString str)
{
    log+=str;
    ui->textEdit->setText(log);
}
 
void Widget::slotDataOnStdout()
{
    QByteArray byteArray =process->readAllStandardOutput();
    addToLog(QString("Read: %1\n").arg(QString(byteArray)));
}
 
void Widget::slotStartedProcess()
{
    addToLog("StartedProcess\n");
}
 
void Widget::slotFineshedProcess(int k)
{
    addToLog(QString("FineshedProcess (exitCode:%1)\n").arg(QString::number(k)));
}
 
void Widget::on_btnStart_clicked()
{
    addToLog("start");
    process->start("SlaveConsol.exe");
    //process->start("SlaveWdg.exe");
}
 
void Widget::on_btnWrite_clicked()
{
    QByteArray array;
    array.append(ui->lineEdit->text());
    array.append('\n');
    addToLog(QString("Write: %1").arg(QString(array)));
    
    process->write(array);
}

Код простенький. Пояснений, думаю, не требует.
Далее. Если бы работали с простым консольным приложением (SlaveConsol.exe из кода выше) наподобие этого

C
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main(int argc, char *argv[])
{
    std::cout<<"Enter name:";
    std::string name;
    std::cin>>name;
 
    std::cout<<"Hello, "<<name;
    return 0;
}
все прекрасно работает. При нажатии на кнопку "Старт" ведущее приложение запускает ведомое, ведущее приложение получает от ведомого: "Enter name:", отсылает имя, получает приветствие.

Пробую тоже самое, но с ведомым GUI приложением (SlaveWdg.exe из кода выше).

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
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include <QProcess>
 
namespace Ui {
class Widget;
}
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
 
private:
    Ui::Widget *ui;
    QString log;
    void addToLog(QString str);
 
private slots:
    void on_btnWrite_clicked();
};
 
#endif // WIDGET_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
#include "widget.h"
#include "ui_widget.h"
#include <iostream>
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::addToLog(QString str)
{
    log+=str;
    ui->textEdit->setText(log);
}
 
void Widget::on_btnWrite_clicked()
{
    std::cout<<"Enter name:";
}
После запуска ведущим приложением ведомое приложение при нажатии на кнопку btnWrite отправляет: "Enter name:". Однако ведущее приложение его не получает. Точнее получает, когда ведомое приложение закрыть. В этом случае ведущее приложение получает и "Enter name:" и по срабатываю слота связанного с сигналом завершения ведомого приложения его код завершения.

Как решить данную проблему?

Добавлено через 54 минуты
Проблема решилась случайным добавлением "std::endl". Почему при работе с консольным приложением все работало и без "std::endl", а GUI было необходимо его добавить?

Как ведомому GUI приложению получать данные?

Добавлено через 9 минут
Можно добавить в ведомое GUI приложение кнопку, слот которой
C++ (Qt)
1
2
3
4
5
6
7
void Widget::on_btnRead_clicked()
{
    std::string in;
    std::cin>>in;
    QString str= QString::fromStdString ( in );
    addToLog(str);
}
Работает. Но как сделать, чтобы чтение данных из std::in происходило по сигналу?

Добавлено через 18 часов 25 минут
Можно как вариант вызывать слот void Widget::on_btnRead_clicked() по таймеру QTimer либо бесконечно в отдельном потоке QThread.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2017, 15:51
Ответы с готовыми решениями:

Обмен данными между диалогом и формой
Привет. Мне нужно передать текст 2ух lineedit из диалога в lineedit формы. Диалог вызывается по...

Обмен данными между приложениями
Добрый день! Есть 2 моих отдельных друг от друга приложения, нужно из одного отправить строку в...

Обмен данными между приложениями по Wi-Fi
Доброго времени суток. Подскажите пожалуйста как сделать программу которая будет работать на 2-х...

Обмен данными между приложениями
Здравствуйте Нужна помощь Нужна программа которая будет брать некие данные из одной программы и...

3
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,685
28.07.2017, 12:49 2
cin - в QProcess.

Добавлено через 1 час 33 минуты
QThread.
1
2 / 2 / 0
Регистрация: 29.08.2016
Сообщений: 43
28.07.2017, 14:16  [ТС] 3
Спасибо, что ответили!
Вы имеете ввиду то, что написано в конце старт топика?
Цитата Сообщение от lell3 Посмотреть сообщение
Можно как вариант вызывать слот void Widget::on_btnRead_clicked() по таймеру QTimer либо бесконечно в отдельном потоке QThread.
В ведомом приложении в отдельном потоке бесконечно проверять std::cin?
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,685
28.07.2017, 14:21 4
Ну перепутал малость. QThread имеется в виду. Не нужен никакой цикл, cin будет ожидать ввода сам по себе. Наверное. После чего поток завершится. Вот сигнал завершения и используй.
1
28.07.2017, 14:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2017, 14:21
Помогаю со студенческими работами здесь

Обмен данными между двумя приложениями
Здравствуйте! Задача такая: существует два приложения: одно содержит кнопки вверх, вниз, влево,...

Обмен данными между С++ и Java EE приложениями
Добрый день! Может кто-нибудь сможет подсказать решение следующей поблемы. У меня есть...

Технология обмен данными между приложениями
Приветствую профессионалов и любителей программирования! Принимайте новичка. Собственно такой...

Обмен данными между двумя приложениями
есть 2 приложения. Приложение 1 - Создает Приложение 2 с помощью CreateProcess(); следовательно...


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

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