2017-09-26 13 views
1

Qt를 사용하는 QProcess와 관련하여 몇 가지 문제가 있습니다. 다음 함수를 누름 단추의 onClick 이벤트와 연결했습니다. 기본적으로이 버튼을 클릭하면 다른 파일을 실행하고 Qt 프로그램에서 출력을 얻고 싶습니다. 이 파일 calculator이 실행되고 출력을 표시 한 다음 사용자의 입력을 기다립니다. calculator는 일부 결과를 출력하고, 결국 종료 등의 파일이있을 때 시나리오에서 Qt에서 연속 QProcess의 표준 출력을 읽습니다.

void runPushButtonClicked() { 
    QProcess myprocess; 
    myprocess.start("./calculator") 
    myprocess.waitForFinished(); 
    QString outputData= myprocess.readStandardOutput(); 
    qDebug() << outputData; 
} 

은이 완벽하게 작동합니다. 그러나 계산기가 결과를 출력 한 후 사용자로부터 추가 입력을 기다리는 경우 내 outputData에 아무것도 표시되지 않습니다. 사실 waitForFinished()은 시간이 초과되었지만 waitForFinished()을 제거하더라도 outputData은 여전히 ​​비어 있습니다.

저는 이미 여기에서 사용 가능한 솔루션 중 일부를 시도했지만이 경우를 처리하지 못했습니다. 모든 지침을 많이 주시면 감사하겠습니다.

+0

_ 이미 시도한 솔루션 중 일부를 시도했습니다. –

+0

Signal과 Slot의 연결 : connect (process, SIGNAL (readyRead()), this, SLOT (readStdOut())); – Daud

답변

0

서브 프로세스가 출력을 생성 할 때 호출되는 신호 처리기를 설정하는 것이 좋습니다. 예 : readyReadStandardOutput에 연결해야합니다.

그러면 하위 프로세스에서 입력을 요구하고 원하는 입력을 보낼 때이를 식별 할 수 있습니다. 이 작업은 readSubProcess()에서 완료됩니다. 다음으로

#include <QtCore> 
#include "Foo.h" 

int main(int argc, char **argv) { 
    QCoreApplication app(argc, argv); 

    Foo foo; 

    qDebug() << "Starting main loop"; 
    app.exec(); 
} 

MAIN.CPP는 서브 프로세스가 시작되고, 입력 체크. calculator 프로그램이 완료되면 주 프로그램도 종료됩니다. 서브 프로세스 계산기 간단한 스크립트 용 Foo.h

#include <QtCore> 

class Foo : public QObject { 
    Q_OBJECT 
    QProcess myprocess; 
    QString output; 

public: 
    Foo() : QObject() { 
     myprocess.start("./calculator"); 

     // probably nothing here yet 
     qDebug() << "Output right after start:" 
       << myprocess.readAllStandardOutput(); 

     // get informed when data is ready 
     connect(&myprocess, SIGNAL(readyReadStandardOutput()), 
       this, SLOT(readSubProcess())); 
    }; 

private slots: 
    // here we check what was received (called everytime new data is readable) 
    void readSubProcess(void) { 
     output.append(myprocess.readAllStandardOutput()); 
     qDebug() << "complete output: " << output; 

     // check if input is expected 
     if (output.endsWith("type\n")) { 
     qDebug() << "ready to receive input"; 

     // write something to subprocess, if the user has provided input, 
     // you need to (read it and) forward it here. 
     myprocess.write("hallo back!\n"); 
     // reset outputbuffer 
     output = ""; 
     } 

     // subprocess indicates it finished 
     if (output.endsWith("Bye!\n")) { 
     // wait for subprocess and exit 
     myprocess.waitForFinished(); 
     QCoreApplication::exit(); 
     } 
    }; 
}; 

사용된다. 출력이 생성되는 위치와 입력이 예상되는 위치를 볼 수 있습니다. 당신이 (예를 들면 GUI를 보여 다른 스레드/프로세스를 .... 관리) 주요 과정에서 다른 작업을 수행 할 필요가없는 경우

#/bin/bash 

echo "Sub: Im calculator!" 

# some processing here with occasionally feedback 
sleep 3 
echo "Sub: hallo" 

sleep 1 

echo "Sub: type" 
# here the script blocks until some input with '\n' at the end comes via stdin 
read BAR 

# just echo what we got from input 
echo "Sub: you typed: ${BAR}" 

sleep 1 
echo "Sub: Bye!" 

는 쉬운 루프 이후에 단지 sleep에서하는 것 하위 프로세스 생성 후 readSubprocess과 같은 것입니다.

+0

시간 내 주셔서 감사합니다. "qDebug() <<"완전한 출력 때문에 내 대답은 작동하지 않습니다. "<< 출력;"이 제 경우에는 절대로 발생하지 않습니다. 나도 몰라. – Daud

+0

내가 대신에 실행을 사용하면 작동하지만 터미널에서는 콘솔이 아닌 출력으로 실행됩니다. – Daud