Как взаимодействовать с приложениями Qt в двух направлениях

Я хочу создать двустороннюю связь между моими приложениями Qt. Я хочу использовать QProcess для этого. Я успешно вызываю дочернее приложение из корневого приложения и отправляю тестовые данные без каких-либо ошибок, но не могу получить никаких данных в дочернем приложении. Буду благодарен за любую помощь. Я использую Qt 4.7.1. Ниже мой тестовый код:

Корневое приложение:

InterProcess::InterProcess(QObject *parent) : QProcess(parent)
{
    process = new QProcess(this);
    process->start(myChildApp);
    process->waitForStarted();
    process->setCurrentWriteChannel(QProcess::StandardOutput);
    process->write("Test");

    connect( process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(error(QProcess::ProcessError)) );
    connect( process, SIGNAL(readyReadStandardError()), this, SLOT(readyReadStandardError()) );
    connect( process, SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadStandardOutput()) );     

QByteArray InterProcess::read()
{
    QByteArray readBuffer = process->readAllStandardOutput();
    return readBuffer;
}

void InterProcess::error( QProcess::ProcessError error )
{
    qDebug() << "Error!";
    qDebug() << error;
}

void InterProcess::readyReadStandardError()
{
    qDebug() << "Ready to read error.";
    qDebug() << process->readAllStandardError();
}

void InterProcess::readyReadStandardOutput()
{
    qDebug() << "The output:";
    QByteArray readBuffer = process->readAllStandardOutput();
    qDebug() << readBuffer;
}

Детское приложение:

InterProcess::InterProcess(QObject *parent) : QProcess(parent)
{
    process = new QProcess();
    process->setCurrentReadChannel(QProcess::StandardOutput);

    connect( process, SIGNAL(readyRead()), this, SLOT(readyReadStandardOutput()));
    connect( process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(error(QProcess::ProcessError)) );
    connect( process, SIGNAL(readyReadStandardError()), this, SLOT(readyReadStandardError()) );
    connect( process, SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadStandardOutput()) );

    process->waitForReadyRead(5000);
}

void InterProcess::readyReadStandardError()
{
    qDebug() << "Ready to read error.";
    qDebug() << process->readAllStandardError();
    setText("REady error");
}

void InterProcess::readyReadStandardOutput()
{
    setMessage("2");
    qDebug() << "The output:";
    QByteArray readBuffer = process->readAllStandardOutput();
    qDebug() << readBuffer;
}
void InterProcess::error( QProcess::ProcessError error )
{
    qDebug() << "Error!";
    qDebug() << error;
    setText(QString(error));
}

2 ответа

Решение

В одном ответе очень сложно объяснить все ошибки, поэтому просто посмотрите на код и спросите, есть ли у вас проблемы. Вот пример использования QProcess в качестве IPC.

Это ваш основной процесс, который создает дополнительный процесс и подключается к его сигналам.

MyApplicaiton.h

#ifndef MYAPPLICATION_H
#define MYAPPLICATION_H
#include <QApplication>

class InterProcess;
class MyApplication : public QApplication {
    Q_OBJECT
public:
    MyApplication(int &argc, char **argv);
signals:
    void mainApplicationSignal();
private slots:
    void onInterProcessSignal();
private:
    InterProcess *mProcess;
};
#endif // MYAPPLICATION_H

MyApplicaiton.cpp

#include "MyApplication.h"
#include "InterProcess.h"

MyApplication::MyApplication(int &argc, char **argv) : QApplication(argc, argv) {
    mProcess = new InterProcess(this);
    connect(mProcess, SIGNAL(interProcessSignal()),
            this, SLOT(onInterProcessSignal()));
    mProcess->start();
}

void MyApplication::onInterProcessSignal() {}

Это пример реализации вашего класса interProcess:

InterProcess.h

class InterProcess : public QProcess {
    Q_OBJECT
public:
    explicit InterProcess(QObject *parent = nullptr);
signals:
    void interProcessSignal();
private slots:
    void onMainApplicationSignal();
};

InterProcess.cpp

#include "InterProcess.h"
#include "MyApplication.h"


InterProcess::InterProcess(QObject *parent) : QProcess(parent) {
    if(parent) {
        auto myApp = qobject_cast<MyApplication *>(parent);
        if(myApp) {
            connect(myApp, SIGNAL(mainApplicationSignal()),
                    this, SLOT(onMainApplicationSignal()));
        }
    }
}

void InterProcess::onMainApplicationSignal() {}

Локально, использование UDP очень удобно и эффективно

void Server::initSocket() {
  udpSocket = new QUdpSocket(this);
  udpSocket->bind(QHostAddress::LocalHost, 7755);
  connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));}


void Server::readPendingDatagrams(){
  while (udpSocket->hasPendingDatagrams()) {
      QByteArray datagram;
      datagram.resize(udpSocket->pendingDatagramSize());
      QHostAddress sender;
      quint16 senderPort;

      udpSocket->readDatagram(datagram.data(), datagram.size(),
                              &sender, &senderPort);

      processTheDatagram(datagram);
  }}
Другие вопросы по тегам