2016-12-14 85 views
1

Qt newbie here :)。 我目前在Qt中使用popen函數執行一個bash腳本,將輸出重定向到我的應用程序中的textBrowser。當我將腳本作爲資源添加到我的項目中時,它似乎不再執行?我使用:/myScript.sh語法,然後嘗試將我的參數添加爲QStrings。 任何意見將不勝感激!運行帶參數的Bash腳本作爲Qt資源

FILE *in; 
char buff[512]; 
QString args = ":/myScript.sh" + <arguments>; 
QByteArray ba = args.toLatin1(); 
char *temp = ba.data(); 
if(!(in = popen(temp , "r"))) 
{ 
    exit(1); 
} 
while(fgets(buff, sizeof(buff), in)!=NULL) 
{ 
    ui->txtConsole->append(buff); 
} 
ui->progressBar->setValue(50); pclose(in); 
+0

我不認爲這會起作用,但我不能確定沒有看到您的代碼。你可以分享你用來生成popen調用,':/ myScript.sh'和QString參數的代碼嗎? – selbie

+0

'FILE * in; char buff [512]; QString args =「:/myScript.sh」+ ; QByteArray ba = args.toLatin1(); char * temp = ba.data();如果(!(in = popen(temp,「r」))){ exit(1); (fgets(buff,sizeof(buff),in)!= NULL){0} { } ui-> txtConsole-> append(buff); } pclose(in);' – Sphics

+2

由於您顯然是在GUI程序中,您可能需要考慮使用'QProcess'而不是'popen()'異步運行程序 –

回答

3

用Qt資源路徑格式調用popen不會達到您的期望。

您有效地試圖調用是這樣的:

popen(":/myScript.sh args", "r"); 

popen功能並不瞭解Qt的資源系統,也不是:/語法什麼。它期望操作系統能夠識別磁盤上路徑的第一個參數。

兩個選擇:

  1. 只是附帶的myScript.sh文件作爲一個單獨的文件,並直接執行它。 (在您嘗試將腳本作爲資源之前,您觀察到的工作情況)。如果您沒有使用編譯的資源,則很有可能它已經是一個磁盤文件。只需在文件的絕對路徑上調用popen,而不是使用:/語法。

  2. 編寫代碼從資源中提取myScript.sh文本文件並將其保存到本地磁盤。然後在該保存的文件上調用popen。

+0

謝謝。它在myScript.sh是一個單獨的文件時起作用。我只是認爲將它作爲資源包含它可能會很好,所以不必每次都複製:) – Sphics

+0

您可以使用'QFile :: copy()'從資源文件複製到實際文件,或者使用'QTemporaryFile :: createNativeFile()' –