2013-06-27 55 views
17

我有一個使用QProcess的代碼。讀取QProcess輸出到字符串

int main(int argc, char *argv[]) 
{ 
    int status=0; 
    QProcess pingProcess; 
    QString ba; 
    QString exec = "snmpget"; 
    QStringList params; 
    params << "-v" << "2c" << "-c" << "public" << "10.18.32.52" << ".1.3.6.1.4.1.30966.1.2.1.1.1.5.10"; 
    status=pingProcess.execute(exec, params); 
    pingProcess.close(); 
} 

這將輸出以下內容。

SNMPv2-SMI::enterprises.30966.1.2.1.1.1.5.10 = STRING: "0.1" 

我想以字符串形式讀取(讀取)此輸出。我搜索了這個,我找不到解決方案。提前致謝。

回答

24

你嘗試QByteArray QProcess::readAllStandardOutput()文檔 - here

的QString可以從QByteArray中

QString output(pingProcess.readAllStandardOutput()); 

被實例化作爲其他人所說的,我加入他們,你不應該使用execute方法及

更換
pingProcess.start(exec, params); 
pingProcess.waitForFinished(); // sets current thread to sleep and waits for pingProcess end 
QString output(pingProcess.readAllStandardOutput()); 
3

@Shf是正確的,你應該使用readAllStandardOutput。但是,您正在使用靜態方法execute()函數。你應該從QProcess的一個實例調用start()。

然後或者用waitForReadyRead等待數據,或者等待進程使用waitForFinished()完成也是一個好主意。

此外,還有一個重載起動功能,它允許您通過在整個命令,這可能使你的代碼更易於閱讀: -

QProcess pingProcess; 
QString exe = "snmpget -v 2c -c public 10.18.32.52 .1.3.6.1.4.1.30966.1.2.1.1.1.5.10"; 
pingProcess.start(exe); 
pingProcess.waitForFinished(); 
QString output(pingProcess.readAllOutput()); 

請注意,調用waitForFinished將掛起當前進程,所以如果你打算做一些需要一段時間的工作,那麼你需要動態創建QProcess並連接到finished()信號,以便連接的插槽讀取數據。

1

你不應該使用QProcess::execute方法,它是靜態的,不會改變你的pingProcess變量。您無法訪問使用此方法開始的進程。您需要改用start()方法。請注意,此方法是異步的。您需要使用waitForFinished然後讀取數據。

pingProcess.start(exec, params); 
pingProcess.waitForFinished(); 
QByteArray output = pingProcess.readAllStandardOutput(); 
1

在更Qt的方式可以嘗試使用readyReadStandardOutput信號:

connect(&pingProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readData())); 

並且在對應時隙READDATA字符串

輸出QString的= pingProcess.readAllStandardOutput();

+0

雖然這是正確的,但您應該意識到,如果進程創建大量輸出,則在進程完成之前可能會接收到多次對readData插槽的調用,因此需要處理數據的串聯並仍然等待信號完成處理。 – TheDarkKnight

+0

True,連接(&pingProcess,SIGNAL(finished(int)),this,SLOT(handleProcessFinish(int); 這樣你不會阻塞流程(另外waitFofFinished有30secs默認超時) – ariwez

+0

是的,但是30秒是等待的最長時間,如果該過程在此之前完成,它將返回。 – TheDarkKnight