问:当QProcess将一行写入stdout时,有没有办法发送信号

jon*_*opf 4 qt qt4

我发现了类似的问题,但从未得到确切答案.我有Qt程序启动QProcess并将输出写入QTextEdit框,到目前为止一切顺利.但只有在程序结束时才会这样做.如果可能的话,我希望程序stdout能够在真实的时间打印出来.在一个理想的世界中,当有一条线路准备好读取时,QProcess会发出某种信号,如果QProcess不可能,那么它是否可能?理想情况下,您仍然可以在进程运行时使用程序的其余部分.

继承了我到目前为止的一些代码,非常简单,它只是将QProcess标准输出的第一行发送到QTextEdit

...
extProcess::extProcess(QObject *parent) :
    QObject(parent)
    extProcess::extProcess(QObject *parent) :
    QObject(parent)
{
    proc = new QProcess(this); //initialize proc
    arguments << "-v";
    connect(proc, SIGNAL(readyRead()), this, SLOT(logReady()));

}

void extProcess::startProcess()
{
    emit clearLog();
    emit outLog("--Process started--");
    proc->start("/Users/jonathan/Desktop/testgg");
}

void extProcess::logReady()
{
       emit outLog(proc->readLine());
}
...
Run Code Online (Sandbox Code Playgroud)

这是我尝试的替代版本,这将显示整个QProcess输出,但仍然只在程序完成时显示它.

    ...
    extProcess::extProcess(QObject *parent) :
    QObject(parent)

{
    proc = new QProcess(this); //initialize proc
    proc->setProcessChannelMode(QProcess::SeparateChannels);
    arguments << "-v";
    connect(proc, SIGNAL(readyReadStandardOutput()), this, SLOT(logReady()));

}


void extProcess::logReady()
{

       while(proc->bytesAvailable()){
               emit outLog(proc->readLine());
       }
}



void extProcess::startProcess()
{
    emit clearLog();
    emit outLog("--Process started--");
    proc->start("/Users/jonathan/Desktop/testgg");
}



void extProcess::killProcess()
{
    proc->terminate();
    emit clearLog();
    emit outLog("--Process Terminated--");
}
....
Run Code Online (Sandbox Code Playgroud)

谢谢

bad*_*err 6

我使用readAllStandardOutput()用于这个目的,它适用于我.

但是我确实注意到它不会收到任何标准输出,直到该进程实际刷新其输出缓冲区("\n"可能不会自动执行此操作,至少不是在我完全特定于平台的Windows体验中).

根据子进程如何写入其输出(C应用程序或C++应用程序),它需要分别调用fflush(stdout);或结束行std::endl;.