我发现了类似的问题,但从未得到确切答案.我有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)
谢谢
我使用readAllStandardOutput()用于这个目的,它适用于我.
但是我确实注意到它不会收到任何标准输出,直到该进程实际刷新其输出缓冲区("\n"可能不会自动执行此操作,至少不是在我完全特定于平台的Windows体验中).
根据子进程如何写入其输出(C应用程序或C++应用程序),它需要分别调用fflush(stdout);或结束行std::endl;.