2013-02-01 17 views
2

我使用QProcess並將其readyReadStandardOutput連接到插槽。但開槽後執行兩次。請告訴我爲什麼?爲什麼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); 
} 

OUTPUT:

Read 
"File read in 0 seconds. 
" 
Read 
"cacheFi" 
Read 
"le -attachFile -fileName "nClothShape1" -directory ... 

最後一個字符串被打破。單詞之間出現「閱讀」。

回答

4

從當處理已經提供通過它的標準輸出信道(STDOUT)新的數據這個信號被髮射的QProcess::readyReadStandardOutput()

的文檔。無論當前的讀取通道如何,它都會被髮射。

插槽被執行多次,原因很簡單,底層進程以獨立和隨機的方式刷新輸出。你不應該關心這件事,因爲它取決於你無法控制的事情。

如果你想保存整個輸出如果你想逐行讀取你應該做

void MainWindow::readOutput(){ 
    bigbuffer.append(myProcess->readAllStandardOutput();) 
} 

,然後

void MainWindow::readOutput(){ 
    while(myProcess.canReadLine()){ 
     qDebug() << myProcess.readLine(); 
    } 
} 

的第二個電話會在這個過程中緩衝離開數據這樣你就不會有像cacheFi這樣的「破碎」讀數。