日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QProcess 类

發(fā)布時間:2025/3/19 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QProcess 类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

順序設(shè)備 - QProcess 類(啟動進(jìn)程,與之交互) - 知乎本文結(jié)構(gòu)如下: 概述函數(shù)詳解準(zhǔn)備階段啟動階段運行階段退出階段其他附:所有函數(shù)概述QProcess 類的作用就是啟動一個程序,然后與之交互。因為和 socket 都是順序設(shè)備類型,所以讀寫的方式基本大差不差。本文將按照…https://zhuanlan.zhihu.com/p/52116398

QProcess 類的作用就是啟動一個程序,然后與之交互。因為和 socket 都是順序設(shè)備類型,所以讀寫的方式基本大差不差。本文將按照:“準(zhǔn)備階段->啟動階段->運行階段->退出階段”的思路來理清如何使用 QProcess 類。

函數(shù)詳解

準(zhǔn)備階段

指定程序獲取:QString program() const設(shè)置:void setProgram(const QString &program) 指定參數(shù)獲取:QStringList arguments() const設(shè)置:void setArguments(const QStringList &arguments) Windows專屬獲取:QString nativeArguments() const設(shè)置:void setNativeArguments(const QString &arguments) 設(shè)置 stdout、stderr獲取:QProcess::ProcessChannelMode processChannelMode() const設(shè)置:void setProcessChannelMode(QProcess::ProcessChannelMode mode)

既然我們要啟動一個程序,當(dāng)然我們要選擇啟動哪個程序了,用 setProgram() 函數(shù)指定,啟動參數(shù)用 setArguments() 來設(shè)置。

關(guān)于 nativeArguments(),這是專門用在 Windows 操作系統(tǒng)上。雖然 Qt 跨平臺已經(jīng)做的很好了,但是在 Windows 系統(tǒng)上,啟動外部程序的命令參數(shù)會調(diào)用 Windows 系統(tǒng)的 API 接口來完成啟動,這時候就只能用 setNativeArguments() 來設(shè)置啟動參數(shù),而不能用 setArguments()。比如說最常見的畫圖程序,我在“我的文檔”中有一個 temp.png 圖片,我想通過畫圖程序來啟動,那么代碼應(yīng)該是這樣的:

QProcess *process = new QProcess(); process->setWorkingDirectory("C:/Users/ren/Documents"); process->setNativeArguments("temp.png"); process->start("mspaint.exe"); process->waitForFinished(); delete process;

關(guān)于 stdout、stderr,任何程序都有一條向外傳輸信息的標(biāo)準(zhǔn)輸出通道,即 stdout,和一條標(biāo)準(zhǔn)錯誤通道,即 stderr。其中 stdout 傳輸正常信息,就是我們用 qDebug() 或者 print() 打印的信息,而 stderr 傳輸錯誤信息。說“通道”可能不是很好理解,其實就是兩個文件,尤其是在萬物皆為文件的 Linux 中。程序輸出的信息寫到這兩個文件,然后屏幕去讀取。在啟動程序前,我們可以用 setProcessChannelMode() 來控制輸出通道的行為。通道行為模式如下:

  • (1)SeparateChannels(默認(rèn)),QProcess 管理這兩條通道,為它們分別保存在兩個單獨的緩沖區(qū)中,此時如果想讀取通道信息的話需要調(diào)用 setReadChannel() 來選擇當(dāng)前讀取通道;
  • (2)MergedChannels?模式是將標(biāo)準(zhǔn)錯誤通道 stderr 合并到 stdout 通道中,原來的 stderr 通道將不會接收任何數(shù)據(jù)。在這種模式下兩種信息會都經(jīng)過 stdout 通道傳輸信息;
  • (3)ForwardedChannels?模式就是將啟動的程序的 stdout、stderr 信息都從主進(jìn)程的 stdout、stderr 通道往外輸出了;
  • (4)ForwardedErrorChannel?模式就是只將 stderr 信息轉(zhuǎn)發(fā)到主進(jìn)程。最常見的場景就是命令行工具,你看我們用命令行啟動一個程序后只看到錯誤信息,其他的信息都保存到一個文件了;
  • (5)ForwardedErrorChannel?模式就是只將 stdout 信息轉(zhuǎn)發(fā)到主進(jìn)程。

特殊程序的設(shè)置

進(jìn)程環(huán)境獲取:QProcessEnvironment processEnvironment() const設(shè)置:void setProcessEnvironment(const QProcessEnvironment &environment) 工作目錄獲取:QString workingDirectory() const設(shè)置:void setWorkingDirectory(const QString &dir)

關(guān)于 processEnvironment(),有些程序啟動的時候需要必要的環(huán)境變量,比如“TMPDIR”為“C:\MyAPP\temp”,或者“PATH”需要某某路徑之類的。

關(guān)于 workingDirectory(),如果設(shè)置了工作目錄,那么 QProcess 將在此目錄中啟動程序。如果沒有設(shè)置,默認(rèn)是本程序的目錄中啟動。

啟動階段

啟動

合并式void start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite)void start(const QString &command, QIODevice::OpenMode mode = ReadWrite)void start(QIODevice::OpenMode mode = ReadWrite)[static]int execute(const QString &program, const QStringList &arguments)[static]int execute(const QString &command) 分離式bool startDetached(qint64 *pid = nullptr)bool startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory = QString(), qint64 *pid = nullptr)bool startDetached(const QString &command) 信號[signal]void started()

狀態(tài)

獲取:QProcess::ProcessState state() const 信號:[signal]void stateChanged(QProcess::ProcessState newState)

當(dāng)一切準(zhǔn)備就緒以后,接下來就是啟動程序了。啟動程序分兩種:start()?和?startDetached()。

(1)start() 函數(shù)

如果在啟動前已經(jīng)用 setProgram() 和 setArguments() 指定了程序和參數(shù),那么直接調(diào)用第三種 start() 函數(shù)即可啟動;如果沒有指定,那么調(diào)用第一種 start() 時需要將程序和參數(shù)傳入?yún)?shù)列表中。

關(guān)于第二種 start(),這個要區(qū)別于第一種和第三種。它的作用是執(zhí)行一個命令而不是啟動一個程序,比如刪除某某文件命令“del /s *.txt”,其中 /s 表示從子目錄刪除指定的文件。如果命令中包含了空格,需要用 \"\" 來包裹住,否則執(zhí)行不通過。如下所示。為了避免踩各種坑,建議用 setProgram() 和 setArguments() 指定了程序和參數(shù),然后調(diào)用第三種 start() 方式。

QProcess process; process.start("dir \"My Documents\"");

關(guān)于 execute() 靜態(tài)函數(shù),它和 start() 唯一的區(qū)別就是:start() 是非阻塞式的,而 execute() 是阻塞式的,即啟動后就一直等待程序結(jié)束,獲得程序的退出代碼為止。此時啟動的程序的所有輸出都轉(zhuǎn)發(fā)到調(diào)用進(jìn)程。

(2)startDetached()

用 startDetached() 啟動程序后,程序就和調(diào)用進(jìn)程分離了。啥意思?就是說如果用 start() 啟動程序,此時如果關(guān)閉了調(diào)用進(jìn)程,那么啟動的程序也會隨之被關(guān)閉;如果用 startDetached() 啟動的話,即使調(diào)用進(jìn)程關(guān)閉,那么啟動的程序依然不受影響的繼續(xù)運行著。

運行階段

進(jìn)程ID:qint64 processId() const 重定向到文件錯誤:void setStandardErrorFile(const QString &fileName, QIODevice::OpenMode mode = Truncate)輸入:void setStandardInputFile(const QString &fileName)輸出:void setStandardOutputFile(const QString &fileName, QIODevice::OpenMode mode = Truncate)[static]QString nullDevice()

關(guān)于 processId(),如果有程序再運行,那么該函數(shù)返回進(jìn)程標(biāo)識符。

關(guān)于重定向,就是本來信息輸出到標(biāo)準(zhǔn)通道,現(xiàn)在都輸出到文件中了。

交互

讀取信息獲取:QProcess::ProcessChannel readChannel() const設(shè)置:void setReadChannel(QProcess::ProcessChannel channel)信號[signalvoid readyReadStandardError()[signalvoid readyReadStandardOutput()讀取QByteArray readAllStandardError()QByteArray readAllStandardOutput()關(guān)閉:void closeReadChannel(QProcess::ProcessChannel channel) 寫入信息獲取:QProcess::InputChannelMode inputChannelMode() const設(shè)置:void setInputChannelMode(QProcess::InputChannelMode mode)關(guān)閉:void closeWriteChannel() 進(jìn)程A->進(jìn)程B:void setStandardOutputProcess(QProcess *destination)

關(guān)于交互,因為 QProcess 是繼承于 QIODevice 的,那么 QIODevice 中的讀寫函數(shù)都可以用在 QProcess 類中。請參考《QIODeivce 類 - 什么是設(shè)備?》.

關(guān)于 setStandardOutputProcess(),就是將1進(jìn)程的信息輸出到2進(jìn)程中,例如“command1 | command2”就可以用如下代碼表示:

QProcess p1; QProcess p2; p1.setStandardOutputProcess(&p2); p1.start("command1"); p2.start("command2");

錯誤

獲取:QProcess::ProcessError error() const 信號:[signal]void errorOccurred(QProcess::ProcessError error)

同步進(jìn)程

bool waitForFinished(int msecs = 30000) bool waitForStarted(int msecs = 30000)

關(guān)于同步進(jìn)程,因為 QProcess 啟動程序是異步的,當(dāng)需要同步處理程序時就需要 waitFor... 相關(guān)的函數(shù)。

退出階段

退出void kill()void terminate() 退出代碼:int exitCode() const 退出狀態(tài):QProcess::ExitStatus exitStatus() const 信號:[signal]void finished(int exitCode, QProcess::ExitStatus exitStatus)

關(guān)于 kill(),作用是殺死當(dāng)前進(jìn)程使之退出。這個函數(shù)也是調(diào)用平臺相關(guān)的 API,如在 Windows 上調(diào)用 TerminateProcess,而在 Unix 和 macOS 上是將 SIGKILL 信號發(fā)送到進(jìn)程中。

關(guān)于 terminate(),區(qū)別于 kill() 這種暴力的退出不同,它在退出進(jìn)程的時候是有機(jī)會提示用戶輸入任何為保存的文件等。在 Windows 上是發(fā)送 WM_CLOSE 到進(jìn)程的頂級窗口,然后發(fā)到進(jìn)程本身的主線程,而 在 Unix 和 macOS 上是發(fā)送 SIGTERM 信號。注意在 Windows 上,沒有事件循環(huán)或者不處理 WM_CLOSE 消息的控制臺程序只能調(diào)用 kill() 來終止。

其他

Windows相關(guān)QProcess::CreateProcessArgumentModifier createProcessArgumentsModifier() constvoid setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier modifier)[static]QStringList systemEnvironment()

關(guān)于 Windows 相關(guān)函數(shù),只能在 Windows 平臺上用。

關(guān)于 systemEnvironment(),該函數(shù)獲取系統(tǒng)的“鍵值對”環(huán)境變量,例如“PATH=/usr/bin:/usr/local/bin”、“HOME=/home/greg”等。

附:所有函數(shù)

  • 準(zhǔn)備階段
    • 指定程序
      • 獲取:QString?program() const
      • 設(shè)置:void?setProgram(const QString &program)
    • 指定參數(shù)
      • 獲取:QStringList?arguments() const
      • 設(shè)置:void?setArguments(const QStringList &arguments)
      • Windows專屬
        • 獲取:QString?nativeArguments() const
        • 設(shè)置:void?setNativeArguments(const QString &arguments)
    • 設(shè)置 stdout、stderr
      • 獲取:QProcess::ProcessChannelMode?processChannelMode() const
      • 設(shè)置:void?setProcessChannelMode(QProcess::ProcessChannelMode mode)
    • 特殊程序的設(shè)置
      • 進(jìn)程環(huán)境
        • 獲取:QProcessEnvironment?processEnvironment() const
        • 設(shè)置:void?setProcessEnvironment(const QProcessEnvironment &environment)
      • 工作目錄
        • 獲取:QString?workingDirectory() const
        • 設(shè)置:void?setWorkingDirectory(const QString &dir)
  • 啟動階段
    • 啟動
      • 合并式
        • void?start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite)
        • void?start(const QString &command, QIODevice::OpenMode mode = ReadWrite)
        • void?start(QIODevice::OpenMode mode = ReadWrite)
        • [static]int?execute(const QString &program, const QStringList &arguments)
        • [static]int?execute(const QString &command)
      • 分離式
        • bool?startDetached(qint64 *pid = nullptr)
        • bool?startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory = QString(), qint64 *pid = nullptr)
        • bool?startDetached(const QString &command)
      • 信號
        • [signal]void?started()
    • 狀態(tài)
      • 獲取:QProcess::ProcessState?state() const
      • 信號:[signal]void?stateChanged(QProcess::ProcessState newState)
  • 運行階段
    • 進(jìn)程ID:qint64?processId() const
    • 重定向到文件
      • 錯誤:void?setStandardErrorFile(const QString &fileName, QIODevice::OpenMode mode = Truncate)
      • 輸入:void?setStandardInputFile(const QString &fileName)
      • 輸出:void?setStandardOutputFile(const QString &fileName, QIODevice::OpenMode mode = Truncate)
      • [static]QString?nullDevice()
    • 交互
      • 讀取信息
        • 獲取:QProcess::ProcessChannel?readChannel() const
        • 設(shè)置:void?setReadChannel(QProcess::ProcessChannel channel)
        • 信號
          • [signalvoid?readyReadStandardError()
          • [signalvoid?readyReadStandardOutput()
        • 讀取
          • QByteArray?readAllStandardError()
          • QByteArray?readAllStandardOutput()
        • 關(guān)閉:void?closeReadChannel(QProcess::ProcessChannel channel)
      • 寫入信息
        • 獲取:QProcess::InputChannelMode?inputChannelMode() const
        • 設(shè)置:void?setInputChannelMode(QProcess::InputChannelMode mode)
        • 關(guān)閉:void?closeWriteChannel()
      • 進(jìn)程A->進(jìn)程B:void?setStandardOutputProcess(QProcess *destination)
    • 錯誤
      • 獲取:QProcess::ProcessError?error() const
      • 信號:[signal]void?errorOccurred(QProcess::ProcessError error)
    • 同步進(jìn)程
      • bool?waitForFinished(int msecs = 30000)
      • bool?waitForStarted(int msecs = 30000)
  • 退出階段
    • 退出
      • void?kill()
      • void?terminate()
    • 退出代碼:int?exitCode() const
    • 退出狀態(tài):QProcess::ExitStatus?exitStatus() const
    • 信號:[signal]void?finished(int exitCode, QProcess::ExitStatus exitStatus)
  • 其他
    • Windows相關(guān)
      • QProcess::CreateProcessArgumentModifier?createProcessArgumentsModifier() const
      • void?setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier modifier)
    • [static]QStringList?systemEnvironment()

總結(jié)

以上是生活随笔為你收集整理的QProcess 类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。