The QProcess 類用於啓動外部程序並與之通信。 更多...
| 頭: | #include <QProcess> |
| qmake: | QT += core |
| 繼承: | QIODevice |
注意: 此類的所有函數 可重入 .
| class | CreateProcessArguments |
| typedef | CreateProcessArgumentModifier |
| enum | ExitStatus { NormalExit, CrashExit } |
| enum | InputChannelMode { ManagedInputChannel, ForwardedInputChannel } |
| enum | ProcessChannel { StandardOutput, StandardError } |
| enum | ProcessChannelMode { SeparateChannels, MergedChannels, ForwardedChannels, ForwardedErrorChannel, ForwardedOutputChannel } |
| enum | ProcessError { FailedToStart, Crashed, Timedout, WriteError, ReadError, UnknownError } |
| enum | ProcessState { NotRunning, Starting, Running } |
| QProcess (QObject * parent = Q_NULLPTR) | |
| virtual | ~QProcess () |
| QStringList | arguments () const |
| void | closeReadChannel (ProcessChannel channel ) |
| void | closeWriteChannel () |
| CreateProcessArgumentModifier | createProcessArgumentsModifier () const |
| QProcess::ProcessError | error () const |
| int | exitCode () const |
| QProcess::ExitStatus | exitStatus () const |
| InputChannelMode | inputChannelMode () const |
| QString | nativeArguments () const |
| ProcessChannelMode | processChannelMode () const |
| QProcessEnvironment | processEnvironment () const |
| qint64 | processId () const |
| QString | program () const |
| QByteArray | readAllStandardError () |
| QByteArray | readAllStandardOutput () |
| ProcessChannel | readChannel () const |
| void | setArguments (const QStringList & arguments ) |
| void | setCreateProcessArgumentsModifier (CreateProcessArgumentModifier modifier ) |
| void | setInputChannelMode (InputChannelMode mode ) |
| void | setNativeArguments (const QString & arguments ) |
| void | setProcessChannelMode (ProcessChannelMode mode ) |
| void | setProcessEnvironment (const QProcessEnvironment & environment ) |
| void | setProgram (const QString & program ) |
| void | setReadChannel (ProcessChannel channel ) |
| void | setStandardErrorFile (const QString & fileName , OpenMode mode = Truncate) |
| void | setStandardInputFile (const QString & fileName ) |
| void | setStandardOutputFile (const QString & fileName , OpenMode mode = Truncate) |
| void | setStandardOutputProcess (QProcess * destination ) |
| void | setWorkingDirectory (const QString & dir ) |
| void | start (const QString & program , const QStringList & arguments , OpenMode mode = ReadWrite) |
| void | start (const QString & command , OpenMode mode = ReadWrite) |
| void | start (OpenMode mode = ReadWrite) |
| QProcess::ProcessState | state () const |
| bool | waitForFinished (int msecs = 30000) |
| bool | waitForStarted (int msecs = 30000) |
| QString | workingDirectory () const |
| virtual bool | atEnd () const |
| virtual qint64 | bytesAvailable () const |
| virtual qint64 | bytesToWrite () const |
| virtual bool | canReadLine () const |
| virtual void | close () |
| virtual bool | isSequential () const |
| virtual bool | open (OpenMode mode = ReadWrite) |
| virtual bool | waitForBytesWritten (int msecs = 30000) |
| virtual bool | waitForReadyRead (int msecs = 30000) |
| void | kill () |
| void | terminate () |
| void | errorOccurred (QProcess::ProcessError error ) |
| void | finished (int exitCode , QProcess::ExitStatus exitStatus ) |
| void | readyReadStandardError () |
| void | readyReadStandardOutput () |
| void | started () |
| void | stateChanged (QProcess::ProcessState newState ) |
| int | execute (const QString & program , const QStringList & arguments ) |
| int | execute (const QString & command ) |
| QString | nullDevice () |
| bool | startDetached (const QString & program , const QStringList & arguments , const QString & workingDirectory = QString(), qint64 * pid = Q_NULLPTR) |
| bool | startDetached (const QString & command ) |
| QStringList | systemEnvironment () |
| void | setProcessState (ProcessState state ) |
| virtual void | setupChildProcess () |
| virtual qint64 | readData (char * data , qint64 maxlen ) |
| virtual qint64 | writeData (const char * data , qint64 len ) |
| typedef | Q_PID |
| QT_NO_PROCESS_COMBINED_ARGUMENT_START |
The QProcess 類用於啓動外部程序並與之通信。
要啓動進程,把希望運行的程序名稱和命令行自變量作為自變量傳遞給 start ()。自變量被供給作為個體字符串在 QStringList .
另外,可以設置要運行的程序采用 setProgram () 和 setArguments (),然後調用 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);
QProcess then enters the Starting state, and when the program has started, QProcess 進入 運行 狀態並發射 started ().
QProcess allows you to treat a process as a sequential I/O device. You can write to and read from the process just as you would access a network connection using QTcpSocket 。然後可以寫入進程標準輸入通過調用 write (),和讀取標準輸齣通過調用 read (), readLine (),和 getChar ()。因為它繼承 QIODevice , QProcess can also be used as an input source for QXmlReader ,或對於生成要上傳的數據使用 QNetworkAccessManager .
When the process exits, QProcess reenters the NotRunning 狀態 (初始狀態),並發射 finished ().
The finished () 信號以自變量形式提供進程退齣代碼和退齣狀態,也可以調用 exitCode () 以獲得最後完成進程的退齣代碼,和 exitStatus () to obtain its exit status. If an error occurs at any point in time, QProcess 將發射 errorOccurred () 信號。也可以調用 error () 以查找最後發生的錯誤類型,和 state () 以查找當前進程狀態。
注意: QProcess is not supported on VxWorks 、iOS、tvOS、watchOS 或 UWP (通用 Windows 平颱)。
進程有 2 個預定義輸齣通道:標準輸齣通道 (
stdout
) 供給常規控製颱輸齣,和標準錯誤通道 (
stderr
) 通常提供由進程打印的錯誤。這些通道錶示 2 個單獨數據流。可以在它們之間切換通過調用
setReadChannel
().
QProcess
發射
readyRead
() 當當前讀取通道數據可用時。它還發射
readyReadStandardOutput
() 當新標準輸齣數據可用時,和當新標準錯誤數據可用時,
readyReadStandardError
() 發射。代替調用
read
(),
readLine
(),或
getChar
(),可以明確讀取 2 通道之一的所有數據通過調用
readAllStandardOutput
() 或
readAllStandardError
().
The terminology for the channels can be misleading. Be aware that the process's output channels correspond to QProcess 's read channels, whereas the process's input channels correspond to QProcess 's write channels. This is because what we read using QProcess is the process's output, and what we write becomes the process's input.
QProcess can merge the two output channels, so that standard output and standard error data from the running process both use the standard output channel. Call setProcessChannelMode () 采用 MergedChannels 在開始激活此特徵的進程之前。還有將正運行進程輸齣轉發到調用主進程的選項,通過傳遞 ForwardedChannels 作為自變量。隻轉發某個輸齣通道是可能的 - 通常會使用 ForwardedErrorChannel ,但 ForwardedOutputChannel 也存在。注意,在 GUI 應用程序中使用通道轉發通常是個壞主意 - 應該以圖形呈現錯誤取而代之。
某些進程需要特殊環境設置纔能運轉。可以為進程設置環境變量通過調用 setProcessEnvironment ()。要設置工作目錄,調用 setWorkingDirectory ()。默認情況下,進程在調用進程的當前工作目錄下運行。
The positioning and the screen Z-order of windows belonging to GUI applications started with
QProcess
are controlled by the underlying windowing system. For Qt 5 applications, the positioning can be specified using the
-qwindowgeometry
命令行選項;X11 應用程序一般接受
-geometry
命令行選項。
注意: On QNX, setting the working directory may cause all application threads, with the exception of the QProcess caller thread, to temporarily freeze during the spawning process, owing to a limitation in the operating system.
QProcess provides a set of functions which allow it to be used without an event loop, by suspending the calling thread until certain signals are emitted:
從主綫程調用這些函數 (綫程調用 QApplication::exec ()) 可能導緻用戶界麵被凍結。
以下範例運行
gzip
以壓縮字符串 Qt rocks!,沒有事件循環:
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
) are not provided by separate applications, but by the command interpreter itself. If you attempt to use
QProcess
to execute these commands directly, it won't work. One possible solution is to execute the command interpreter itself (
cmd.exe
在某些 Windows 係統),和要求解釋器執行期望命令。
另請參閱 QBuffer , QFile ,和 QTcpSocket .
注意: 此 typedef 隻可用於桌麵 Windows。
在 Windows,
QProcess
使用 Win32 API 函數
CreateProcess
去啓動子級進程。而
QProcess
提供啓動進程的舒適方式而無需擔心平颱細節,在某些情況下調優是可取的將參數傳遞給
CreateProcess
。這被履行通過定義
CreateProcessArgumentModifier
函數並把它傳遞給
setCreateProcessArgumentsModifier
.
A
CreateProcessArgumentModifier
函數接受一參數:指針指嚮
CreateProcessArguments
結構。此結構的成員會被傳遞給
CreateProcess
後於
CreateProcessArgumentModifier
函數被調用。
以下範例演示如何把自定義標誌傳遞給
CreateProcess
。當從控製颱進程 A 啓動控製颱進程 B 時,
QProcess
默認情況下,進程 B 將重用進程 A 的控製颱窗口。在此範例中,將為子級進程 B 創建具有自定義配色方案的新控製颱窗口。
QProcess process;
process.setCreateProcessArgumentsModifier([] (QProcess::CreateProcessArguments *args)
{
args->flags |= CREATE_NEW_CONSOLE;
args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES;
args->startupInfo->dwFlags |= STARTF_USEFILLATTRIBUTE;
args->startupInfo->dwFillAttribute = BACKGROUND_BLUE | FOREGROUND_RED
| FOREGROUND_INTENSITY;
});
process.start("C:\\Windows\\System32\\cmd.exe", QStringList() << "/k" << "title" << "The Child Process");
另請參閱 QProcess::CreateProcessArguments and setCreateProcessArgumentsModifier ().
此枚舉描述不同退齣狀態為 QProcess .
| 常量 | 值 | 描述 |
|---|---|---|
QProcess::NormalExit
|
0
|
進程正常退齣。 |
QProcess::CrashExit
|
1
|
進程崩潰。 |
另請參閱 exitStatus ().
此枚舉描述進程輸入通道模式為 QProcess 。將這些值之一傳遞給 setInputChannelMode () 去設置當前寫入通道模式。
| 常量 | 值 | 描述 |
|---|---|---|
QProcess::ManagedInputChannel
|
0
|
QProcess 管理正運行進程的輸入。這是默認輸入通道模式為 QProcess . |
QProcess::ForwardedInputChannel
|
1
|
QProcess 把主進程輸入轉發給正運行進程。子級進程從主進程的相同源讀取其標準輸入。注意:主進程不得試著讀取其標準輸入 (當子級進程正運行時)。 |
該枚舉在 Qt 5.2 引入或被修改。
另請參閱 setInputChannelMode ().
此枚舉描述正運行進程所使用的進程通道。傳遞這些值之一給 setReadChannel () 設置當前讀取通道為 QProcess .
| 常量 | 值 | 描述 |
|---|---|---|
QProcess::StandardOutput
|
0
|
正運行進程的 stdout (標準輸齣)。 |
QProcess::StandardError
|
1
|
正運行進程的 stderr (標準錯誤)。 |
另請參閱 setReadChannel ().
此枚舉描述進程的輸齣通道模式為 QProcess 。將這些值之一傳遞給 setProcessChannelMode () 以設置當前讀取通道模式。
| 常量 | 值 | 描述 |
|---|---|---|
QProcess::SeparateChannels
|
0
|
QProcess 管理正運行進程的輸齣,將標準輸齣和標準錯誤數據保持在單獨內部緩衝中。可以選擇 QProcess 的當前讀取通道通過調用 setReadChannel ()。這是默認通道模式對於 QProcess . |
QProcess::MergedChannels
|
1
|
QProcess
將在運行進程的輸齣閤並到標準輸齣通道 (
stdout
)。標準錯誤通道 (
stderr
) 將不接收任何數據。在運行進程的標準輸齣和標準錯誤數據是交錯的。
|
QProcess::ForwardedChannels
|
2
|
QProcess 將正運行進程的輸齣轉發到主進程。由子級進程寫入其標準輸齣和標準錯誤的任何內容,都將寫入主進程的標準輸齣和標準錯誤。 |
QProcess::ForwardedErrorChannel
|
4
|
QProcess 管理在運行進程的標準輸齣,但會將標準錯誤轉發到主進程。這反映將命令行工具作為過濾器的典型用法,其中標準輸齣被重定嚮到另一進程 (或文件),而標準錯誤被打印到控製颱為診斷目的 (該值在 Qt 5.2 引入)。 |
QProcess::ForwardedOutputChannel
|
3
|
與 ForwardedErrorChannel 互補 (該值在 Qt 5.2 引入)。 |
注意: Windows 有意抑製從僅 GUI 應用程序輸齣到繼承控製颱。這 not 適用於重定嚮到文件或管道的輸齣。盡管如此,要在控製颱轉發僅 GUI 應用程序的輸齣,必須使用 SeparateChannels 和通過讀取輸齣並將其寫入適當輸齣通道自己來履行轉發。
另請參閱 setProcessChannelMode ().
此枚舉描述錯誤的不同類型,報告通過 QProcess .
| 常量 | 值 | 描述 |
|---|---|---|
QProcess::FailedToStart
|
0
|
The process failed to start. Either the invoked program is missing, or you may have insufficient permissions to invoke the program. |
QProcess::Crashed
|
1
|
進程有時崩潰在成功啓動後。 |
QProcess::Timedout
|
2
|
最後 waitFor...() 函數超時。狀態對於 QProcess 不變,和可以再次試著調用 waitFor...()。 |
QProcess::WriteError
|
4
|
發生錯誤當試圖寫入進程時。例如,進程可能未運行,或它可能已關閉其輸入通道。 |
QProcess::ReadError
|
3
|
發生錯誤當試圖從進程讀取時。例如,進程可能未運行。 |
QProcess::UnknownError
|
5
|
發生未知錯誤。這是默認返迴值為 error (). |
另請參閱 error ().
此枚舉描述不同狀態為 QProcess .
| 常量 | 值 | 描述 |
|---|---|---|
QProcess::NotRunning
|
0
|
進程未運行。 |
QProcess::Starting
|
1
|
進程正在啓動,但尚未援引程序。 |
QProcess::Running
|
2
|
進程正在運行且讀寫就緒。 |
另請參閱 state ().
構造 QProcess 對象采用給定 parent .
[虛擬]
QProcess::
~QProcess
()
銷毀 QProcess 對象,即:殺除進程。
注意:此函數不會返迴直到進程被終止。
返迴上次啓動進程采用的命令行自變量。
該函數在 Qt 5.0 引入。
另請參閱 setArguments () 和 start ().
[虛擬]
bool
QProcess::
atEnd
() const
重實現自 QIODevice::atEnd ().
返迴
true
if the process is not running, and no more data is available for reading; otherwise returns
false
.
[虛擬]
qint64
QProcess::
bytesAvailable
() const
重實現自 QIODevice::bytesAvailable ().
[虛擬]
qint64
QProcess::
bytesToWrite
() const
重實現自 QIODevice::bytesToWrite ().
[虛擬]
bool
QProcess::
canReadLine
() const
重實現自 QIODevice::canReadLine ().
此函數運轉於當前讀取通道。
另請參閱 readChannel () 和 setReadChannel ().
[虛擬]
void
QProcess::
close
()
重實現自 QIODevice::close ().
關閉進程的所有通信並殺除它。在調用此函數後, QProcess 將不再發射 readyRead (),且無法再讀取或寫入數據。
關閉讀取通道 channel 。在調用此函數後, QProcess 將不再接收通道數據。任何已收到的數據仍可用於讀取。
調用此函數以節省內存,若對進程的輸齣不感興趣。
另請參閱 closeWriteChannel () 和 setReadChannel ().
調度寫入通道對於 QProcess 要被關閉。一旦所有數據被寫入進程,通道就將關閉。在調用此函數後,任何寫入進程的試圖都將失敗。
關閉寫入通道是必要的,對於讀取輸入數據 (直到通道被關閉為止) 的程序而言。例如,程序 more 用於在 Unix 和 Windows 控製颱中顯示文本數據。但它不會顯示文本數據直到 QProcess 的寫入通道被關閉。範例:
QProcess more; more.start("more"); more.write("Text to display"); more.closeWriteChannel(); // QProcess will emit readyRead() once "more" starts printing
寫入通道被隱式打開當 start () 被調用。
另請參閱 closeReadChannel ().
返迴先前設置的
CreateProcess
修飾符函數。
注意: 此函數隻可用於 Windows 平颱。
該函數在 Qt 5.7 引入。
另請參閱 setCreateProcessArgumentsModifier () 和 QProcess::CreateProcessArgumentModifier .
返迴最後發生的錯誤類型。
另請參閱 state ().
[signal]
void
QProcess::
errorOccurred
(
QProcess::ProcessError
error
)
此信號被發射當進程發生錯誤時。指定 error 描述發生的錯誤類型。
該函數在 Qt 5.6 引入。
[static]
int
QProcess::
execute
(const
QString
&
program
, const
QStringList
&
arguments
)
啓動程序 program 采用自變量 arguments 在新進程中,等待它完成,然後返迴進程的退齣代碼。新進程寫入控製颱的任何數據會被轉發給調用進程。
環境和工作目錄繼承自調用進程。
自變量處理分彆等同 start () 重載。
若進程無法啓動,返迴 -2。若進程崩潰,返迴 -1。否則,返迴進程的退齣代碼。
另請參閱 start ().
[static]
int
QProcess::
execute
(const
QString
&
command
)
這是重載函數。
啓動程序 command in a new process, waits for it to finish, and then returns the exit code.
自變量處理分彆等同 start () 重載。
之後 command 字符串被拆分並取消引號,此函數的行為像接受字符串列錶作為自變量的重載。
另請參閱 start ().
返迴最後完成進程的退齣代碼。
此值無效除非 exitStatus () 返迴 NormalExit .
返迴最後完成的進程退齣狀態。
在 Windows,若進程被另一應用程序的 TerminateProcess() 所終止,此函數仍會返迴 NormalExit 除非退齣代碼小於 0。
該函數在 Qt 4.1 引入。
[signal]
void
QProcess::
finished
(
int
exitCode
,
QProcess::ExitStatus
exitStatus
)
此信號被發射當進程完成時。 exitCode 是進程的退齣代碼 (僅對正常退齣有效),和 exitStatus 是退齣狀態。在進程完成後,緩衝在 QProcess 仍完好無損。仍可以讀取進程可能已寫入的任何數據在完成之前。
注意: 信號 finished 在此類中是重載。要使用函數指針句法連接到此信號,必須在靜態鑄造中指定信號類型,如此範例所示:
connect(process, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), [=](int exitCode, QProcess::ExitStatus exitStatus){ /* ... */ });
另請參閱 exitStatus ().
返迴通道模式對於 QProcess 標準輸入通道。
該函數在 Qt 5.2 引入。
另請參閱 setInputChannelMode () 和 InputChannelMode .
[虛擬]
bool
QProcess::
isSequential
() const
重實現自 QIODevice::isSequential ().
[slot]
void
QProcess::
kill
()
殺除當前進程,導緻它立即退齣。
在 Windows,kill() 使用 TerminateProcess,而在 Unix 和 macOS,把 SIGKILL 信號發送給進程。
另請參閱 terminate ().
返迴程序的附加本機命令行自變量。
注意: 此函數隻可用於 Windows 平颱。
該函數在 Qt 4.7 引入。
另請參閱 setNativeArguments ().
[static]
QString
QProcess::
nullDevice
()
操作係統的 null 設備。
返迴的文件路徑使用本機目錄分隔符。
該函數在 Qt 5.2 引入。
另請參閱 QProcess::setStandardInputFile (), QProcess::setStandardOutputFile (),和 QProcess::setStandardErrorFile ().
[虛擬]
bool
QProcess::
open
(
OpenMode
mode
= ReadWrite)
重實現自 QIODevice::open ().
啓動程序設置通過 setProgram () 采用自變量設置通過 setArguments ()。 OpenMode 被設為 mode .
此方法是彆名化的 start (),且存在僅為完全實現定義接口通過 QIODevice .
另請參閱 start (), setProgram (),和 setArguments ().
返迴通道模式對於 QProcess 標準輸齣和標準錯誤通道。
該函數在 Qt 4.2 引入。
另請參閱 setProcessChannelMode (), ProcessChannelMode ,和 setReadChannel ().
返迴環境從 QProcess 將傳遞給其子級進程,或空對象若沒有設置環境使用 setEnvironment() 或 setProcessEnvironment ()。若沒有設置環境,將使用調用進程的環境。
該函數在 Qt 4.6 引入。
另請參閱 setProcessEnvironment (), setEnvironment (),和 QProcessEnvironment::isEmpty ().
返迴正在運行進程的本機進程標識符,若可用。若目前沒有進程正在運行,
0
被返迴。
該函數在 Qt 5.3 引入。
返迴進程最後一次啓動時采用的程序。
該函數在 Qt 5.0 引入。
另請參閱 setProgram () 和 start ().
不管當前讀取通道,此函數從進程標準錯誤返迴所有可用數據按 QByteArray .
另請參閱 readyReadStandardError (), readAllStandardOutput (), readChannel (),和 setReadChannel ().
不管當前讀取通道,此函數從進程標準輸齣返迴所有可用數據按 QByteArray .
另請參閱 readyReadStandardOutput (), readAllStandardError (), readChannel (),和 setReadChannel ().
返迴當前讀取通道為 QProcess .
另請參閱 setReadChannel ().
[virtual protected]
qint64
QProcess::
readData
(
char
*
data
,
qint64
maxlen
)
重實現自 QIODevice::readData ().
[signal]
void
QProcess::
readyReadStandardError
()
此信號被發射當進程已使新數據可用透過其標準錯誤通道 (
stderr
)。它被發射不管當前
讀取通道
.
注意: 這是私有信號。它可以用於信號連接,但不能由用戶發射。
另請參閱 readAllStandardError () 和 readChannel ().
[signal]
void
QProcess::
readyReadStandardOutput
()
此信號被發射當進程已使新數據可用透過其標準輸齣通道 (
stdout
)。它被發射不管當前
讀取通道
.
注意: 這是私有信號。它可以用於信號連接,但不能由用戶發射。
另請參閱 readAllStandardOutput () 和 readChannel ().
設置 arguments 以傳遞給被調用程序當啓動進程時。必須調用此函數先於 start ().
該函數在 Qt 5.1 引入。
另請參閱 start (), setProgram (),和 arguments ().
設置
modifier
為
CreateProcess
Win32 API 調用。傳遞
QProcess::CreateProcessArgumentModifier()
以移除先前設置的。
注意: 此函數隻可用於 Windows 平颱且要求 C++ 11。
該函數在 Qt 5.7 引入。
另請參閱 createProcessArgumentsModifier () 和 QProcess::CreateProcessArgumentModifier .
設置通道模式為 QProcess 標準輸入通道到 mode 指定。會使用此模式當下次 start () 被調用。
該函數在 Qt 5.2 引入。
另請參閱 inputChannelMode () 和 InputChannelMode .
這是重載函數。
設置額外本機命令行 arguments 為程序。
在操作係統中,若係統 API 用於傳遞命令行 arguments 到本機子進程使用單字符串,可以設想無法傳遞命令行憑藉 QProcess 基於列錶的可移植 API。在這種情況下,必須使用此函數來設置字符串, appended 到通常由自變量列錶閤成的字符串,帶定界空格。
注意: 此函數隻可用於 Windows 平颱。
該函數在 Qt 4.7 引入。
另請參閱 nativeArguments ().
設置通道模式為 QProcess 標準輸齣和標準錯誤通道到 mode 指定。會使用此模式當下次 start () 被調用。例如:
QProcess builder; builder.setProcessChannelMode(QProcess::MergedChannels); builder.start("make", QStringList() << "-j2"); if (!builder.waitForFinished()) qDebug() << "Make failed:" << builder.errorString(); else qDebug() << "Make output:" << builder.readAll();
該函數在 Qt 4.2 引入。
另請參閱 processChannelMode (), ProcessChannelMode ,和 setReadChannel ().
設置 environment that QProcess 將傳遞給子級進程。
例如,以下代碼添加環境變量
TMPDIR
:
QProcess process; QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert("TMPDIR", "C:\\MyApp\\temp"); // Add an environment variable process.setProcessEnvironment(env); process.start("myapp");
注意,在 Windows 環境變量名不區分大小寫。
該函數在 Qt 4.6 引入。
另請參閱 processEnvironment (), QProcessEnvironment::systemEnvironment (),和 setEnvironment ().
[protected]
void
QProcess::
setProcessState
(
ProcessState
state
)
設置當前狀態為 QProcess 到 state 指定。
另請參閱 state ().
設置 program 為使用當啓動進程時。此函數必須被調用先於 start ().
該函數在 Qt 5.1 引入。
另請參閱 start (), setArguments (),和 program ().
設置當前讀取通道為 QProcess 到給定 channel 。當前輸入通道用於函數 read (), readAll (), readLine (),和 getChar ()。它還確定哪個通道觸發 QProcess 以發射 readyRead ().
另請參閱 readChannel ().
將進程的標準錯誤重定嚮到文件 fileName 。當重定嚮到位時,標準錯誤讀取通道被關閉:讀取它使用 read () 將始終失敗,就像 readAllStandardError ()。文件將被追加若 mode 為 Append,否則, 它將被截取。
見 setStandardOutputFile () 瞭解如何打開文件的更多相關信息。
注意:若 setProcessChannelMode () 被調用采用自變量 QProcess::MergedChannels ,此函數不起作用。
該函數在 Qt 4.2 引入。
另請參閱 setStandardInputFile (), setStandardOutputFile (),和 setStandardOutputProcess ().
將進程的標準輸入重定嚮到文件指示通過 fileName 。當輸入重定嚮到位時, QProcess 對象將處於隻讀模式 (調用 write () 將導緻齣錯)。
要使進程立即讀取 EOF,傳遞 nullDevice () 在此。這更清潔比使用 closeWriteChannel () 在寫入任何數據之前,因為在啓動進程之前可以設置它。
若文件 fileName 不存在此刻 start () 被調用或不可讀,啓動進程將失敗。
在進程啓動後調用 setStandardInputFile() 不起作用。
該函數在 Qt 4.2 引入。
另請參閱 setStandardOutputFile (), setStandardErrorFile (),和 setStandardOutputProcess ().
將進程的標準輸齣重定嚮到文件 fileName 。當重定嚮到位時,標準輸齣讀取通道被關閉:讀取它使用 read () 將始終失敗,就像 readAllStandardOutput ().
要丟棄來自進程的所有標準輸齣,傳遞 nullDevice () 在此。這比簡單從不讀取標準輸齣更高效,因為沒有 QProcess 緩衝被填充。
若文件 fileName 不存在此刻 start () 被調用,它將被創建。若它無法被創建,啓動將失敗。
若文件存在且 mode is QIODevice::Truncate , the file will be truncated. Otherwise (if mode is QIODevice::Append ), the file will be appended to.
在進程啓動後調用 setStandardOutputFile() 不起作用。
該函數在 Qt 4.2 引入。
另請參閱 setStandardInputFile (), setStandardErrorFile (),和 setStandardOutputProcess ().
將此進程的標準輸齣流管道到 destination 進程的標準輸入。
以下 Shell 命令:
command1 | command2
可以施行采用 QProcess 通過以下代碼:
QProcess process1; QProcess process2; process1.setStandardOutputProcess(&process2); process1.start("command1"); process2.start("command2");
該函數在 Qt 4.2 引入。
把工作目錄設為 dir . QProcess 將在此目錄下啓動進程。默認行為是在調用進程的工作目錄下啓動進程。
注意: 在 QNX,這可能導緻所有應用程序綫程被臨時凍結。
另請參閱 workingDirectory () 和 start ().
[virtual protected]
void
QProcess::
setupChildProcess
()
此函數在子級進程上下文中被調用,恰好在 Unix 或 macOS 程序執行前 (即:後於
fork()
,但先於
execve()
)。重實現此函數,以履行最後時刻初始化子級進程。範例:
class SandboxProcess : public QProcess { ... protected: void setupChildProcess(); ... }; void SandboxProcess::setupChildProcess() { // Drop all privileges in the child process, and enter // a chroot jail. #if defined Q_OS_UNIX ::setgroups(0, 0); ::chroot("/etc/safe"); ::chdir("/"); ::setgid(safeGid); ::setuid(safeUid); ::umask(0); #endif }
無法退齣進程 (例如:通過調用 exit()) 從此函數。若需要在開始執行前停止程序,解決方案是發射 finished () 然後調用 exit()。
警告: 此函數被調用通過 QProcess 僅在 Unix 和 macOS。在 Windows 和 QNX,它不被調用。
啓動給定 program 在新進程中,傳遞的命令行自變量在 arguments .
The QProcess 對象將立即進入 Starting 狀態。若進程成功啓動, QProcess 將發射 started ();否則, errorOccurred () 會被發射。
注意: 進程是異步啓動的,這意味著 started () 和 errorOccurred () 信號可能被延遲。調用 waitForStarted () 以確保進程已啓動 (或啓動失敗) 且這些信號已被發射。
注意: 不履行進一步的自變量分割。
Windows:
自變量加引號並被拼接到兼容命令行采用
CommandLineToArgvW()
Windows 函數。對於有不同命令行要求加引號的程序,需要使用
setNativeArguments
()。值得注意的是程序不遵循
CommandLineToArgvW()
規則是 cmd.exe,因此是所有批處理腳本。
The OpenMode 被設為 mode .
若 QProcess 對象已在運行進程,可能在控製颱打印警告,且現有進程將不受影響地繼續運行。
另請參閱 processId (), started (), waitForStarted (),和 setNativeArguments ().
這是重載函數。
啓動命令 command 按新進程。 OpenMode 被設為 mode .
command 是包含程序名稱及其自變量的單文本字符串。自變量由一個或多個空格分隔。例如:
QProcess process; process.start("del /s *.txt"); // same as process.start("del", QStringList() << "/s" << "*.txt"); ...
必須引用包含空格的自變量纔能被正確提供給新進程。例如:
QProcess process; process.start("dir \"My Documents\"");
文字引號在 command 字符串由 3 引號錶示。例如:
QProcess process; process.start("dir \"Epic 12\"\"\" Singles\"");
之後 command 字符串被拆分並取消引號,此函數的行為像接受字符串列錶作為自變量的重載。
可以禁用此重載通過定義
QT_NO_PROCESS_COMBINED_ARGUMENT_START
when you compile your applications. This can be useful if you want to ensure that you are not splitting arguments unintentionally, for example. In virtually all cases, using the other overload is the preferred method.
在將命令行自變量傳遞給子進程的本機係統 API 使用單字符串的 Windows 操作係統,可以設想無法傳遞命令行憑藉 QProcess 的基於列錶的可移植 API。在這些罕見情況下,需要使用 setProgram () 和 setNativeArguments () 而不是此函數。
這是重載函數。
啓動程序設置通過 setProgram () 采用自變量設置通過 setArguments ()。 OpenMode 被設為 mode .
該函數在 Qt 5.1 引入。
另請參閱 open (), setProgram (),和 setArguments ().
[static]
bool
QProcess::
startDetached
(const
QString
&
program
, const
QStringList
&
arguments
, const
QString
&
workingDirectory
= QString(),
qint64
*
pid
= Q_NULLPTR)
啓動程序
program
采用自變量
arguments
按新進程中,並與之分離。返迴
true
當成功時;否則返迴
false
。若調用進程退齣,分離進程將不受影響地繼續運行。
自變量處理分彆等同 start () 重載。
Unix: 啓動進程將在它自己的會話中運行,且行動像守護程序。
進程將被啓動在目錄 workingDirectory 。若 workingDirectory 為空,工作目錄繼承自調用進程。
注意: 在 QNX,這可能導緻所有應用程序綫程被臨時凍結。
若函數成功,那麼 * pid 被設為啓動進程的進程標識符。
另請參閱 start ().
[static]
bool
QProcess::
startDetached
(const
QString
&
command
)
這是重載函數。
啓動命令
command
按新進程中,並與之分離。返迴
true
當成功時;否則返迴
false
.
自變量處理分彆等同 start () 重載。
之後 command 字符串被拆分並取消引號,此函數的行為像接受字符串列錶作為自變量的重載。
另請參閱 start (const QString &command, OpenMode mode).
[signal]
void
QProcess::
started
()
此信號發射由 QProcess 當此過程已開始,且 state () 返迴 運行 .
注意: 這是私有信號。它可以用於信號連接,但不能由用戶發射。
返迴進程的當前狀態。
另請參閱 stateChanged () 和 error ().
[signal]
void
QProcess::
stateChanged
(
QProcess::ProcessState
newState
)
此信號發射每當狀態對於 QProcess 改變。 newState 自變量為狀態 QProcess 要改變。
注意: 這是私有信號。它可以用於信號連接,但不能由用戶發射。
[static]
QStringList
QProcess::
systemEnvironment
()
以 key=value 對列錶形式返迴調用進程的環境。範例:
QStringList environment = QProcess::systemEnvironment(); // environment = {"PATH=/usr/bin:/usr/local/bin", // "USER=greg", "HOME=/home/greg"}
此函數不緩存係統環境。因此,獲得環境的更新版本是可能的,若低級 C 庫函數像
setenv
or
putenv
有被調用。
不管怎樣,注意,重復調用此函數將重新創建環境變量列錶 (非通俗操作)。
注意: 對於新代碼,推薦使用 QProcessEnvironment::systemEnvironment ()
該函數在 Qt 4.1 引入。
另請參閱 QProcessEnvironment::systemEnvironment () 和 setProcessEnvironment ().
[slot]
void
QProcess::
terminate
()
試圖終止進程。
進程可能不會因調用此函數而退齣 (它有機會提示用戶是否有未保存的文件,等等)。
在 Windows,terminate() 將 WM_CLOSE 消息張貼到進程的所有頂層窗口,然後張貼到進程本身的主綫程。在 Unix 和 macOS,
SIGTERM
信號被發送。
不運行事件循環的 Windows 控製颱應用程序 (或其事件循環不處理 WM_CLOSE 消息),隻可被終止通過調用 kill ().
另請參閱 kill ().
[虛擬]
bool
QProcess::
waitForBytesWritten
(
int
msecs
= 30000)
重實現自 QIODevice::waitForBytesWritten ().
阻塞直到進程已完成且 finished () 信號已發射,或直到 msecs 毫秒已過去。
返迴
true
若進程已完成;否則返迴
false
(若操作超時,若發生錯誤,或者若此
QProcess
已完成)。
可以在沒有事件循環的情況下操作此函數。它很有用,當編寫非 GUI 應用程序和在非 GUI 綫程中履行 I/O 操作時。
警告: 從主 GUI 綫程調用此函數可能導緻用戶界麵被凍結。
若 msecs 為 -1,此函數不會超時。
另請參閱 finished (), waitForStarted (), waitForReadyRead (),和 waitForBytesWritten ().
[虛擬]
bool
QProcess::
waitForReadyRead
(
int
msecs
= 30000)
重實現自 QIODevice::waitForReadyRead ().
阻塞直到進程啓動且 started () 信號已發射,或直到 msecs 毫秒已過去。
返迴
true
若進程成功啓動;否則返迴
false
(若操作超時或齣現錯誤)。
可以在沒有事件循環的情況下操作此函數。它很有用,當編寫非 GUI 應用程序和在非 GUI 綫程中履行 I/O 操作時。
警告: 從主 GUI 綫程調用此函數可能導緻用戶界麵被凍結。
若 msecs 為 -1,此函數不會超時。
注意: 在某些 UNIX 操作係統,此函數可能返迴 true 但進程可能稍後報告 QProcess::FailedToStart 錯誤。
另請參閱 started (), waitForReadyRead (), waitForBytesWritten (),和 waitForFinished ().
若 QProcess 已賦值工作目錄,此函數返迴工作目錄 QProcess 將在程序開始之前進入。否則,返迴空字符串 (即:沒有賦值目錄),且 QProcess 將使用應用程序的當前工作目錄取而代之。
另請參閱 setWorkingDirectory ().
[virtual protected]
qint64
QProcess::
writeData
(const
char
*
data
,
qint64
len
)
重實現自 QIODevice::writeData ().
用於錶示底層平颱進程的標識符 typedef。在 Unix,這相當於
qint64
;在 Windows,它相當於
_PROCESS_INFORMATION*
.
另請參閱 QProcess::pid ().
禁用 QProcess::start() overload taking a single string. In most cases where it is used, the user intends for the first argument to be treated atomically as per the other overload.
該函數在 Qt 5.6 引入。
另請參閱 QProcess::start (const QString &command, OpenMode mode).