我使用QProcess并将它的readyReadStandardOutput连接到插槽。但是在启动插槽后执行两次。请告诉我,为什么会这样?
{
myProcess = new QProcess(parent);
myProcess->start("mayabatch.exe -file "+scene);
connect(myProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));
}
void MainWindow::readOutput()
{
qDebug()<<"Read";
QByteArray outData = myProcess->readAllStandardOutput();
qDebug()<<QString(outData);
}
输出:
Read
"File read in 0 seconds.
"
Read
"cacheFi"
Read
"le -attachFile -fileName "nClothShape1" -directory ...
最后一个字符串被破坏了。单词之间出现“阅读”。
答案 0 :(得分:8)
来自QProcess::readyReadStandardOutput()
当进程通过其标准输出通道(stdout)提供新数据时,将发出此信号。无论当前读取通道如何,都会发出它。
插槽的执行不止一次,原因很简单,因为底层进程以单独和随机的方式刷新了输出。你不应该关心这个,因为它取决于你无法控制的事情。
如果你想保存整个输出,你应该这样做
void MainWindow::readOutput(){
bigbuffer.append(myProcess->readAllStandardOutput();)
}
如果你想逐行阅读,那么
void MainWindow::readOutput(){
while(myProcess.canReadLine()){
qDebug() << myProcess.readLine();
}
}
第二个调用会将数据保留在进程缓冲区中,这样您就不会有像cacheFi
这样的“损坏”读取。