Qt中的QProcess類

Qt中的QProcess類

QProcess 是 Qt 框架中用于啟動和控制外部進程的類,它屬于 QtCore 模塊。這個類提供了執行外部程序并與它們交互的功能。

一、主要功能

  1. 啟動外部程序:可以啟動系統上的其他可執行程序
  2. 進程通信:通過標準輸入、輸出和錯誤流與子進程通信
  3. 進程控制:可以終止、殺死或等待進程完成
  4. 狀態監控:能夠檢測進程的運行狀態和退出狀態

二、常用方法

2.1 進程控制

  • start(): 啟動一個進程
  • startDetached(): 啟動一個獨立于父進程的進程
  • terminate(): 嘗試正常終止進程
  • kill(): 強制終止進程
  • waitForFinished(): 阻塞等待進程結束

2.2 狀態查詢

  • state(): 返回進程當前狀態(未運行、啟動中、運行中)
  • exitStatus(): 返回進程退出狀態
  • exitCode(): 返回進程退出代碼

2.3 進程通信

  • write(): 向進程的標準輸入寫入數據
  • readAllStandardOutput(): 讀取所有標準輸出
  • readAllStandardError(): 讀取所有標準錯誤

三、信號與槽

QProcess 提供了多個有用的信號:

  • started(): 進程啟動時發出
  • finished(int exitCode, QProcess::ExitStatus exitStatus): 進程結束時發出
  • errorOccurred(QProcess::ProcessError error): 發生錯誤時發出
  • readyReadStandardOutput(): 標準輸出有新數據可讀時發出
  • readyReadStandardError(): 標準錯誤有新數據可讀時發出

四、使用示例

4.1. 啟動外部程序

QProcess 可以通過多種方式啟動外部程序,包括直接運行可執行文件或通過命令行參數。

#include <QCoreApplication>
#include<QProcess>
#include<QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// Set up code that uses the Qt event loop here.// Call a.quit() or a.exit() to quit the application.// A not very useful example would be including// #include <QTimer>// near the top of the file and calling// QTimer::singleShot(5000, &a, &QCoreApplication::quit);// which quits the application after 5 seconds.// If you do not need a running Qt event loop, remove the call// to a.exec() or use the Non-Qt Plain C++ Application template.QProcess process;process.start("C:\\Program Files\\Microsoft Office\\root\\Office16\\WINWORD.EXE");if(!process.waitForStarted(1000)){qDebug() << "程序啟動失敗" << process.errorString();}qDebug() << "程序啟動成功";process.waitForFinished();qDebug() << "程序已結束";return a.exec();
}

4.2. 傳遞參數給外部程序

你可以通過參數列表向外部程序傳遞參數。

QProcess process;
QStringList arguments;
arguments << "file.txt"; // 參數:打開一個文件process.start("notepad.exe", arguments); // 啟動記事本并打開 file.txt
if (!process.waitForStarted())
{qDebug() << "程序啟動失敗:" << process.errorString();
}

4.3. 讀取外部程序的輸出

QProcess 可以捕獲外部程序的標準輸出和標準錯誤輸出。

QProcess process;
process.start("ls", QStringList() << "-l"); // 在 Linux 上運行 ls -l 命令
if (!process.waitForStarted())
{qDebug() << "程序啟動失敗:" << process.errorString();return -1;
}process.waitForFinished(); // 等待程序結束// 讀取標準輸出
QByteArray output = process.readAllStandardOutput();
qDebug() << "程序輸出:" << output;// 讀取標準錯誤輸出
QByteArray errorOutput = process.readAllStandardError();
qDebug() << "錯誤輸出:" << errorOutput;

4.4. 向外部程序發送輸入

你可以通過 QProcess 向外部程序的標準輸入發送數據。

QProcess process;
process.start("cat"); // 啟動 cat 命令(用于回顯輸入)
if (!process.waitForStarted())
{qDebug() << "程序啟動失敗:" << process.errorString();return -1;
}// 向外部程序發送輸入
process.write("Hello, World!\n");
process.closeWriteChannel(); // 關閉寫入通道,表示輸入結束process.waitForFinished(); // 等待程序結束
qDebug() << "程序輸出:" << process.readAllStandardOutput();

4.5. 設置工作目錄

你可以指定外部程序的工作目錄。

QProcess process;
process.setWorkingDirectory("/path/to/directory"); // 設置工作目錄
process.start("ls", QStringList() << "-l");

4.6. 信號與槽

QProcess 提供了多個信號,用于在程序運行過程中進行交互,例如:

  • started():程序啟動時發出。
  • finished(int exitCode, QProcess::ExitStatus exitStatus):程序結束時發出。
  • readyReadStandardOutput():有標準輸出可讀時發出。
  • readyReadStandardError():有標準錯誤輸出可讀時發出。
#include <QProcess>
#include <QDebug>void setupProcess()
{QProcess *process = new QProcess();QObject::connect(process, &QProcess::started, []() {qDebug() << "程序已啟動";});QObject::connect(process, &QProcess::finished, [](int exitCode, QProcess::ExitStatus exitStatus) {qDebug() << "程序已結束,退出碼:" << exitCode;});QObject::connect(process, &QProcess::readyReadStandardOutput, [process]() {qDebug() << "標準輸出:" << process->readAllStandardOutput();});QObject::connect(process, &QProcess::readyReadStandardError, [process]() {qDebug() << "標準錯誤輸出:" << process->readAllStandardError();});process->start("ls", QStringList() << "-l");
}

4.7. 終止外部程序

你可以通過 kill()terminate() 方法終止外部程序。

QProcess process;
process.start("notepad.exe");// 等待一段時間后終止程序
QTimer::singleShot(5000, [&process]() {process.terminate(); // 嘗試終止程序if (!process.waitForFinished(3000)) // 等待程序結束{process.kill(); // 強制終止}
});

五、注意事項

  1. 在 Windows 上,某些控制臺程序可能需要特定的工作環境
  2. 對于長時間運行的進程,建議使用異步方式處理
  3. 注意進程的生命周期管理,避免內存泄漏
  4. 考慮使用 QProcessEnvironment 來設置進程環境變量

QProcess 是 Qt 中處理外部進程的強大工具,適用于需要與系統其他程序交互的應用程序開發。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913413.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913413.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913413.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

周任務自動化升級:N8N與多維表格無縫聯動全解析

.自動化之言&#xff1a; 在上一篇文章中&#xff0c;我們介紹了如何利用多維表格&#xff08;如飛書多維表格或Notion&#xff09;搭建一個靈活的任務管理系統。現在我們將進一步擴展這個系統&#xff0c;借助 N8N 實現周報的自動匯總與郵件發送&#xff0c;真正實現任務管理…

Go語言的web框架--gin

本章內容&#xff0c;會介紹一下gin的運用&#xff0c;以及gin框架底層的內容&#xff0c;話不多說&#xff0c;開始進入今天的主題吧&#xff01; 一.基本使用 gin框架支持前后端不分離的形式&#xff0c;也就是直接使用模板的形式。 模板是什么&#xff1f; 這里可能有同…

企業為什么需要雙因素認證?

從進入互聯網時代開始&#xff0c;密碼是我們個人日常的重要保護。但是單獨的密碼保護可能已經不再適應當前的數字化時代。密碼已經不再足夠安全最近發生的各種安全漏洞讓我重新審視網絡安全。幾行代碼可能就導致了全球數以百萬的登錄憑證被泄露。今天&#xff0c;僅僅周期性地…

Spring Boot + 本地部署大模型實現:優化與性能提升!

在Spring Boot中集成本地部署的大模型&#xff08;如LLaMA、ChatGLM等&#xff09;并進行優化&#xff0c;需要從模型選擇、推理加速、資源管理和架構設計等多方面入手。以下是完整的優化方案及實現步驟&#xff1a; 一、核心優化策略 1. 模型量化 目標&#xff1a;減少顯存占…

仿mudou庫one thread oneloop式并發服務器

前言 我們所要實現的是一個高并發服務器的組件&#xff0c;使服務器的性能更加高效&#xff0c;是一個高并發服務器的組件&#xff0c;并不包含實際的業務。 首先需要先明確我們所要實現的目標是什么 第一點&#xff0c;實現一個高并發的服務器第二點&#xff0c;在服務器的基礎…

超詳細的私有化安裝部署Dify服務以及安裝過程中問題處理

一、什么是Dify Dify 是一款開源的大語言模型(LLM) 應用開發平臺。它融合了后端即服務&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使開發者可以快速搭建生產級的生成式 AI 應用。即使你是非技術人員&#xff0c;也能參與到 AI 應用的定義和數據…

國產DSP,QXS320F280049,QXS320F28377D,QXS320F2800137,QXS320F28034

自定義指令集&#xff0c;自研內核架構&#xff0c;基于eclipse自研IDE&#xff0c;工具鏈&#xff0c;算法庫。 根據自研QXS320F280049&#xff0c;做了600W和2KW數字電源方案&#xff0c;1.5KW電機方案&#xff0c;目前已在市場大量投產。 QXS320F290049應用于數字電源&#…

dotnet publish 發布后的項目,例如asp.net core mvc項目如何在ubuntu中運行,并可外部訪問

復制到 Ubuntu 上的是使用 Visual Studio 或 dotnet publish 命令生成的 發布后的輸出文件&#xff08;publish output&#xff09;&#xff0c;而不是原始項目源代碼。在這種情況下&#xff0c;確實沒有 .csproj 文件&#xff0c;所以不能直接用 dotnet run 啟動。但你可以通過…

Linux多線程(十二)之【生產者消費者模型】

文章目錄生產者消費者模型為何要使用生產者消費者模型生產者消費者模型優點基于BlockingQueue的生產者消費者模型BlockingQueueC queue模擬阻塞隊列的生產消費模型單線程生產消費模型多線程生產消費模型生產者消費者模型 consumer/productor 321原則(便于記憶) 為何要使用生產…

MySQL表的操作(3)

文章目錄前言一、創建表創建表時指定屬性二、查看表查看表結構查看建表消息三、修改表修改列屬性修改列名修改表名四、刪除表總結前言 Hello! 那我們乘勝追擊&#xff0c;開始 表的操作&#xff01; 一、創建表 首先創建一個 數據庫 testForTable mysql> create database i…

從“人工智障”到“智能助手”:集成為什么能拯救AI用戶體驗?

幾年前&#xff0c;當人們滿懷期待地與AI語音助手對話時&#xff0c;常常遭遇令人啼笑皆非的回應——“抱歉&#xff0c;我不明白你在說什么”“請再說一遍”甚至答非所問。AI被戲稱為“人工智障”&#xff0c;用戶體驗一度讓人失望。然而&#xff0c;近年來&#xff0c;隨著技…

Uniapp 自定義TabBar + 動態菜單實現教程(Vuex狀態管理詳解)

大家好&#xff0c;我是一諾。今天跟大家分享一下uniapp 封裝自定義底部導航欄&#xff08;TabBar&#xff09; 過程中的思考和實踐。通過本文&#xff0c;你將學會如何打造一個功能完善、可自由定制的TabBar組件&#xff01; 先看效果&#xff1a; 支持自定義圖標和樣式動態顯…

MySQL數據庫主從復制

概述1、master開啟二進制日志記錄2、slave開啟IO進程&#xff0c;從master中讀取二進制日志并寫入slave的中繼日志3、slave開啟SQL進程&#xff0c;從中繼日志中讀取二進制日志并進行重放4、最終&#xff0c;達到slave與master中數據一致的狀態&#xff0c;我們稱作為主從復制的…

Rancher Server + Kubernets搭建云原生集群平臺

目錄Rancher Server Kubernets搭建云原生集群平臺一、環境準備1、軟件準備2、環境規劃3、掛載數據盤二、虛擬機初始化基礎配置&#xff08;所有節點都需要操作&#xff09;1、執行時間服務器腳本&#xff08;包括配置hostName主機名&#xff09;2、配置hosts文件3、配置各節點…

Java學習第八部分——泛型

目錄 一、概述 &#xff08;一&#xff09;定義 &#xff08;二&#xff09;作用 &#xff08;三&#xff09;引入原因 二、使用 &#xff08;一&#xff09;類 &#xff08;二&#xff09;接口 &#xff08;三&#xff09;方法 三、類型參數 &#xff08;一&#xf…

定時點擊二次鼠標 定時點擊鼠標

定時點擊二次鼠標 定時點擊鼠標 今天分享一個定時點擊兩次的小工具。 我們在生活中&#xff0c;可能會遇到一些定時點擊的任務。比如說在晚上9點去發送一個群發&#xff0c;或者倒計時點擊一個按鈕。那么可以使用這個工具&#xff0c;僅適用于Windows電腦。 #定時點擊鼠標 #倒計…

Linux網絡配置與故障排除完全指南

1. ifconfig命令 - 網絡接口配置器 ifconfig&#xff08;interface configurator&#xff09;是Linux系統中最基礎的網絡配置工具。該命令可以初始化網絡接口、分配IP地址、啟用或禁用接口&#xff0c;同時還能查看接口的詳細信息。 查看網絡接口信息 # ifconfig eth0 …

Python Pytest-Benchmark詳解:精準性能測試的利器

在軟件開發的迭代過程中&#xff0c;性能優化如同精密手術&#xff0c;需要精準的測量工具。Pytest-Benchmark作為pytest生態中的性能測試插件&#xff0c;憑借其無縫集成能力和專業統計功能&#xff0c;成為Python開發者進行基準測試的首選工具。本文將深入解析其技術特性與實…

60天python訓練營打卡day51

學習目標&#xff1a; 60天python訓練營打卡 學習內容&#xff1a; DAY 51 復習日 作業&#xff1a;day43的時候我們安排大家對自己找的數據集用簡單cnn訓練&#xff0c;現在可以嘗試下借助這幾天的知識來實現精度的進一步提高 學習時間&#xff1a; 2025.07.04 浙大疏錦行…

支持向量機(SVM)在肺部CT圖像分類(肺癌檢測)中的實現與優化

?? 博主簡介:CSDN博客專家、CSDN平臺優質創作者,高級開發工程師,數學專業,10年以上C/C++, C#, Java等多種編程語言開發經驗,擁有高級工程師證書;擅長C/C++、C#等開發語言,熟悉Java常用開發技術,能熟練應用常用數據庫SQL server,Oracle,mysql,postgresql等進行開發應用…