C++ Qt開發:QProcess進程管理模塊

来源:https://www.cnblogs.com/LyShark/p/18089471
-Advertisement-
Play Games

Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹如何運用`QProcess`組件實現針對進程的控制管理等。當你在使用Qt進行跨平臺應用程式開發時,經常需要與外部進... ...


Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹如何運用QProcess組件實現針對進程的控制管理等。

當你在使用Qt進行跨平臺應用程式開發時,經常需要與外部進程進行交互,這時就可以利用Qt的QProcess模塊。QProcess模塊提供了啟動和控制外部進程的功能,能夠執行外部命令、運行其他可執行文件,以及與外部進程進行通信。通過QProcess,可以方便地執行命令行命令、調用系統工具、執行腳本等。QProcess還可以捕獲外部進程的輸出,以及監視外部進程的運行狀態,從而實現更靈活、高效的進程管理。

以下是QProcess類的一些常用函數及其解釋的表格:

函數 描述
start(const QString &program, const QStringList &arguments) 啟動一個新的進程,program參數指定要執行的程式,arguments參數指定傳遞給程式的參數列表。
startDetached(const QString &program, const QStringList &arguments) 啟動一個新的進程,但不會等待進程退出,也不會將輸出傳遞給調用進程。
waitForStarted(int msecs = 30000) 等待進程啟動,如果在指定時間內進程沒有啟動,將返回false。
waitForFinished(int msecs = 30000) 等待進程退出,如果在指定時間內進程沒有退出,將返回false。
readAllStandardOutput() 讀取進程的標準輸出,並返回為QByteArray
readAllStandardError() 讀取進程的標準錯誤輸出,並返回為QByteArray
write(const QByteArray &data) 向進程的標準輸入寫入數據。
closeWriteChannel() 關閉進程的標準輸入。
kill() 終止進程。
terminate() 終止進程。
start(const QString &program) 啟動一個新的進程,program參數指定要執行的程式。
setWorkingDirectory(const QString &dir) 設置進程的工作目錄。
state() 返回進程的當前狀態。
error() 返回進程的錯誤狀態。
pid() 返回進程的進程ID。
waitForBytesWritten(int msecs = 30000) 等待寫入到進程的數據已經被完全寫入。
waitForReadyRead(int msecs = 30000) 等待進程有數據可讀。
startDetached(const QString &program) 啟動一個新的進程,但不會等待進程退出,也不會將輸出傳遞給調用進程。
setProcessChannelMode(QProcess::ProcessChannelMode mode) 設置進程通信模式,可選值包括QProcess::SeparateChannelsQProcess::MergedChannels

這些函數提供了控制進程的各種方法,可以實現啟動、監視、控制和與外部進程進行交互的功能。

進程式控制制模塊可以實現對特定進程的啟動關閉,本章將以執行命令行為例,通過調用Start()可以拉起一個第三方進程。

QProcess類的start()函數有幾種不同的重載形式,但最常用的是以下形式:

bool QProcess::start(
    const QString &program, 
    const QStringList &arguments, 
    QIODevice::OpenMode mode = ReadWrite
)

函數用於啟動一個新的進程,並執行指定的程式(program參數)。arguments參數指定了傳遞給程式的參數列表,它是一個QStringList類型的參數,可以為空。mode參數指定了啟動進程時打開的模式,預設為ReadWrite。函數返回一個bool類型的值,表示進程是否成功啟動。

當調用start()執行命令後,我們則可以通過readAllStandardOutput()函數從進程的標準輸出中讀取所有可用的數據,並將其返回為 QByteArray 對象。

QByteArray QProcess::readAllStandardOutput()

這個函數沒有參數,它會立即返回當前可用的標準輸出數據,並將輸出數據作為位元組數組返回。如果沒有可用的輸出數據,它將返回一個空的位元組數組。

當然了,與之對應的readAllStandardError()是函數,該函數可以用於從進程的標準錯誤輸出中讀取所有可用的數據,並將其返回為 QByteArray 對象。

QByteArray QProcess::readAllStandardError()

該函數同樣沒有參數,它會立即返回當前可用的標準錯誤輸出數據,並將輸出數據作為位元組數組返回。如果沒有可用的錯誤輸出數據,它將返回一個空的位元組數組。

1.1 獲取進程信息

此處我們以輸出系統進程信息為例,通常可以調用tasklist /FO CSV來獲取系統中的進程列表,並將其輸出為CSV格式,通過調用如下函數則可以獲取到系統進程信息。

process.start("tasklist", QStringList() << "/FO" << "CSV");

此時通過調用readAllStandardOutput函數我們可以將緩衝區內的數據讀出並將其放入到一個QString類型變數內;

QString output = process.readAllStandardOutput();

當具備了這個列表後,就可以根據冒號來逐行讀入並切割,通過迴圈的方式將其追加到treeWidget組件內,並以此來實現展示的效果;

void MainWindow::on_pushButton_clicked()
{
    CallProcess();

    ui->treeWidget->clear();

    QProcess process;
    process.start("tasklist", QStringList() << "/FO" << "CSV");

    if (process.waitForFinished())
    {
        QString output = process.readAllStandardOutput();
        output.replace("\"", "");

        QStringList lines = output.split("\n");

        // 跳過第一行標題
        for(int i = 1; i < lines.size(); ++i)
        {
            QStringList fields = lines[i].split(",");

            // 確保至少有五個欄位
            if(fields.size() >= 5)
            {
                QStringList rowData;
                for(int j = 0; j < 5; ++j)
                {
                    rowData << fields[j].trimmed();
                }
                ui->treeWidget->addTopLevelItem(new QTreeWidgetItem(rowData));
            }
        }

        // 設置列標題
        ui->treeWidget->setHeaderLabels(QStringList() << "進程名稱" << "PID" << "會話名稱" << "Session"<< "記憶體占用");
    } else
    {
        QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
        item->setText(0, "Failed to execute tasklist command.");
    }
}

運行後當點擊輸出系統進程時則可以看到完整的進程輸出效果,如下圖所示;

使用此方法我們可以很好的讀取到系統中的各種信息,只要能夠合理的過濾出想要的欄位即可,當需要輸出系統信息時我們可以通過process.start("systeminfo")調用系統命令獲取到,如下代碼所示;

void MainWindow::on_pushButton_2_clicked()
{
    ui->treeWidget->clear();

    // 獲取系統信息
    QProcess process;
    process.start("systeminfo");

    if (process.waitForFinished())
    {
     QByteArray output = process.readAllStandardOutput();

     // 使用正確的文本編碼對輸出進行解碼
     QTextCodec *codec = QTextCodec::codecForName("GBK");
     QString text = codec->toUnicode(output);

     QStringList lines = text.split("\n");
     for (const QString &line : lines)
     {
         // 解析系統信息,添加到 QTreeWidget 中
         QStringList fields = line.split(":", Qt::SkipEmptyParts);
         if (fields.size() >= 2)
         {
             QString property = fields[0].trimmed();
             QString value = fields[1].trimmed();

             QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
             item->setText(0, property);
             item->setText(1, value);
         }
     }

     // 設置列標題
     ui->treeWidget->setHeaderLabels(QStringList() << "系統信息" << "數值");
    } else
    {
     QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
     item->setText(0, "Failed to execute systeminfo command.");
    }
}

運行後當用戶點擊輸出系統信息按鈕時,因systeminfo運行時間較長所以需要等待一段時間,輸出效果如下圖所示;

文章出處:https://www.cnblogs.com/LyShark/p/18089471
本博客所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • AJAX AJAX是開發者的夢想,因為你可以: 在不重新載入頁面的情況下更新網頁 在頁面載入後請求來自伺服器的數據 在頁面載入後接收來自伺服器的數據 在後臺向伺服器發送數據 HTML頁面 <!DOCTYPE html> <html> <body> <div id="demo"> <h2>讓AJAX更 ...
  • 一、UDP UDP(User Datagram Protocol),用戶數據包協議,是一個簡單的面向數據報的通信協議,即對應用層交下來的報文,不合併,不拆分,只是在其上面加上首部後就交給了下麵的網路層 也就是說無論應用層交給UDP多長的報文,它統統發送,一次發送一個報文 而對接收方,接到後直接去除首 ...
  • 所有主要的瀏覽器都內置了一個XML解析器,用於訪問和操作XML XML 解析器 在訪問XML文檔之前,必須將其載入到XML DOM對象中 所有現代瀏覽器都有一個內置的XML解析器,可以將文本轉換為XML DOM對象 解析文本字元串 以下示例將一個文本字元串解析為XML DOM對象,並使用JavaSc ...
  • 概述:C++結構體的`sizeof`不總是等於每個成員的`sizeof`之和,因為對齊和填充影響了記憶體佈局。未對齊的結構體可能存在間隙,而對齊的結構體會插入填充以保持對齊。通過示例展示了結構體的記憶體對齊和填充,以及如何使用模板元編程列印結構體成員的偏移量,深入理解記憶體佈局。 在C++中,結構體的si ...
  • C++ 語法 讓我們將以下代碼分解以更好地理解它: 示例 #include <iostream> using namespace std; int main() { cout << "Hello World!"; return 0; } 示例解釋 第 1 行:#include <iostream> ...
  • https://leetcode.cn/problems/trapping-rain-water/description/?envType=study-plan-v2&envId=top-interview-150 對於一個可以構成“碗”的序列,最後裝滿水的話應該和最短的一邊齊平,那麼可以左右各遍歷 ...
  • 1 Spark 的 local 模式 Spark 運行模式之一,用於在本地機器上單機模擬分散式計算的環境。在 local 模式下,Spark 會使用單個 JVM 進程來模擬分散式集群行為,所有 Spark 組件(如 SparkContext、Executor 等)都運行在同一個 JVM 進程中,不涉 ...
  • 雲原生技術正重塑IT領域,本文深度剖析了其發展歷程、核心概念、生態系統及實踐案例,展望未來趨勢,揭示了這一技術如何引領企業轉型與創新。 關註【TechLeadCloud】,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...