QProcess類官方簡介

2021-10-08 06:20:25 字數 2690 閱讀 1830

目錄

通過通道通訊

同步程序api

windows使用者注意事項

執行過程

要啟動程序需要將要執行的程式的名稱和命令列引數作為引數傳遞給start()函式。設定引數的方式有兩種:

最後,呼叫start()函式或open()函式啟動程序。

例如,以下**片段通過在引數列表中傳遞包含「 -style」和「 fusion」在x11平台上以fusion樣式執行模擬時鐘示例:

qobject *parent;

...qstring program = "./path/to/qt/examples/widgets/analogclock";

qstringlist arguments;

arguments << "-style" << "fusion";

qprocess *myprocess = new qprocess(parent);

myprocess->start(program, arguments);

呼叫start()函式或open()函式後qprocess進入啟動狀態,並且在程式啟動後,qprocess進入執行狀態並發出started()訊號。

qprocess允許開發人員將程序視為順序i/o裝置——可以像使用qtcpsocket訪問網路連線一樣來寫入和讀取該程序。開發人員可以通過呼叫write()函式寫入程序的標準輸入,並通過呼叫read()函式,readline()函式和getchar()函式讀取標準輸出。因為qprocess繼承了qiodevice,所以它還可以用作qxmlreader的輸入源,或生成要使用qnetworkaccessmanager上載的資料。

當程序退出時,qprocess重新進入notrunning狀態(初始狀態),並發出finish()訊號。finish()訊號將程序的退出**和退出狀態作為引數提供,開發人員還可以呼叫exitcode()函式獲得最後完成的程序的退出**,並呼叫exitstatus()函式獲得其退出狀態。如果在任何時間點發生錯誤,qprocess將發出erroroccurred()訊號。開發人員還可以呼叫error()函式來查詢最後發生的錯誤型別,並呼叫state()函式來查詢當前程序狀態。

注意:vxworks,ios,tvos,watchos或通用windows平台不支援qprocess。

程序具有兩個預定義的輸出通道:標準輸出通道(stdout)提供常規控制台輸出,而標準錯誤通道(stderr)通常提供由程序列印的錯誤。這些通道代表兩個單獨的資料流,可以通過呼叫setreadchannel()函式在它們之間切換。當前讀取通道上有可用資料時,qprocess發出readyread()訊號。當有新的標準輸出資料可用時,它也會發出readyreadstandardoutput()訊號,而當有新的標準錯誤資料可用時,它會發出readyreadstandarderror()訊號。無需呼叫read()函式,readline()函式或getchar()函式,而是可以通過呼叫readallstandardoutput()函式或readallstandarderror()函式顯式地從兩個通道之一讀取所有資料。

通道的術語可能會產生誤導。請注意,程序的輸出通道與qprocess的讀取通道相對應,而程序的輸入通道與qprocess的寫入通道相對應。這是因為我們使用qprocess讀取的內容是程序的輸出,而我們編寫的內容則成為程序的輸入。

qprocess可以合併兩個輸出通道,因此執行過程中的標準輸出和標準錯誤資料都使用標準輸出通道。在啟動啟用此功能的過程之前,請使用mergedchannels呼叫setprocesschannelmode()函式。還可以選擇通過傳遞forwardedchannels作為引數,將正在執行的程序的輸出**到呼叫主程序。也可以只**其中乙個輸出通道——通常乙個將使用forwardederrorchannel,但forwardedoutputchannel也存在。請注意,在gui應用程式中使用通道**通常不是乙個好主意——應該以圖形方式顯示錯誤。

某些過程需要特殊的環境設定才能執行。呼叫setprocessenvironment()函式可以為程序設定環境變數。呼叫setworkingdirectory()函式可以為程序設定工作目錄。預設情況下,程序在呼叫程序的當前工作目錄中執行。

屬於qprocess開頭的gui應用程式的視窗的位置和螢幕z順序由基礎視窗系統控制。對於qt 5應用程式,可以使用-qwindowgeometry命令列選項指定位置。 x11應用程式通常接受-geometry命令列選項。

注意:在qnx上,由於作業系統的限制,設定工作目錄可能會導致所有應用程式執行緒(除qprocess呼叫程式執行緒之外)在生成過程中暫時凍結。

qprocess gzip;

gzip.start("gzip", qstringlist() << "-c");

if (!gzip.waitforstarted())

return false;

gzip.write("qt rocks!");

gzip.closewritechannel();

if (!gzip.waitforfinished())

return false;

qbytearray result = gzip.readall();

某些windows命令(例如,dir)不是由單獨的應用程式提供的,而是由命令直譯器本身提供的。 如果您嘗試使用qprocess直接執行這些命令,它將無法正常工作。 一種可能的解決方案是執行命令直譯器本身(在某些windows系統上為cmd.exe),然後要求直譯器執行所需的命令。

QT 在qt中使用QProcess類執行tar指令

qt提供了乙個qprocess類用於啟動外部程式並與之通訊。這個類是非同步工作的,而且在後台執行,這樣使用者介面就可以始終保持響應。qprocess start 與qprocess execute 都能完成啟動外部程式的任務,二者有什麼區別呢?區別在於start 是非阻塞的,而execute 是阻塞...

LeetCode官方ListNode類仿寫

class listnode leetcode官方listnode類仿寫 模擬官方功能 主要用於本地ide除錯 參考 def init self,val 構造器 param val 構造物件 self.cycle false ifisinstance val,list iflen val 1 sel...

包裝類簡介

包裝類作為和基本資料型別對應的型別存在,方便物件操作。包裝類包含每種基本資料型別相關屬性。基本資料型別 包裝類byte byte boolean boolean short short char character intinteger long long float float double do...