Qt外部調用進程類QProcess的使用

有的時候我們需要在自己程序運行過程中調用其他進程,那么就需要用到QProcess。

首先可以了解一些關于進程的相關知識:線程與進程,你真得理解了嗎_進程和線程的區別-CSDN博客

進程是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配的基本單位,是操作系統結構的基礎。?

如何查看系統中正在運行的進程以及如何殺死進程:

Windows:

啟動進程:tasklist

殺死進程:taskkill /F /PID 4204(進程id)?

?

Linux:

查看進程:ps -ef

殺死進程:kill -9 4341(進程id)

?QProces的使用:

QProcess通過start和startDetached兩個方法都可以啟動進程,其中前者是一體式啟動,即外部程序啟動后,將隨主程序的退出而退出。后者是分離式啟動,即外部程序啟動后,當主程序退出時并不退出,而是繼續運行。

這次主要說start這個方法:
void?
start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite)?

主要需要注意第一個參數和第二個參數,第一個參數是要執行的命令或者程序,第二個參數是這個程序的運行參數。關于這兩個先看一個最簡單的qt程序代碼:

#include <QCoreApplication>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);return a.exec();
}

這個代碼大家再熟悉不過來,就是一個最簡單的qt控制臺程序,不知道大家有沒有注意過main函數的兩個參數argc和argv[]。

  1. int argc:代表命令行參數的數量,即傳遞給程序的參數個數。通常情況下,argc至少為1,因為第一個參數通常是程序本身的名稱。

  2. char *argv[]:是一個指向字符指針數組的指針,其中每個元素是一個指向表示一個命令行參數的C風格字符串的指針。argv[0]通常是程序的名稱,后續元素是傳遞給程序的其他參數。

試著打印一下:

#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);for (int i = 0; i < argc; ++i) {qDebug() << argv[i];}return a.exec();
}

編譯運行查看打印:

打印了一個參數,即程序的名稱。試著給這個控制臺程序啟動時加幾個參數:

?

使用QtCreator傳入運行參數也可以這樣設置:

?

?運行查看結果:

?也可以使用QCoreApplication::arguments()打印參數:

#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);for (int i = 0; i < argc; ++i) {qDebug() << argv[i];}QStringList args = QCoreApplication::arguments();for (const QString &arg : args) {qDebug() << arg;}return a.exec();
}

編譯運行查看:

QProcess使用start傳入對應參數,這是要啟動的程序:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);for (const QString &arg : QCoreApplication::arguments()) {ui->textEdit->append(arg);}
}MainWindow::~MainWindow() { delete ui; }

將程序參數顯示到對應QTextEdit上:

#include <QCoreApplication>
#include <QDebug>
#include <QProcess>
int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QProcess *p = new QProcess;QStringList args;args << "1"<< "2"<< "3";p->start("G:\\qtprojects\\ConsoleP\\debug\\ConsoleP.exe", args);return a.exec();
}

編譯查看運行結果:

QProcess通過processId來獲取對應進程id。?

關于QProcess的信號:

?其中readyReadStandardError()與readyReadStandardOutput()收到對應信號后通過readAllStandardOutput()與readAllStandardError()來獲取對應程序標準輸出以及異常輸出,進程運行完成后會觸發finished()信號,進程狀態改變會觸發stateChanged信號。寫一個例子:

頭文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass QProcess;
class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:void appendLog(const QString &text);private slots:void on_open_clicked();void on_cmd_clicked();void on_clear_clicked();private:Ui::MainWindow *ui;QProcess *m_Process;
};
#endif // MAINWINDOW_H

源文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDateTime>
#include <QFileDialog>
#include <QProcess>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);m_Process = new QProcess;connect(m_Process, &QProcess::readyReadStandardOutput, [=]() {QByteArray output = m_Process->readAllStandardOutput();QString outputString = QString::fromLocal8Bit(output);appendLog("output:" + outputString);});connect(m_Process, &QProcess::readyReadStandardError, [=]() {QByteArray output = m_Process->readAllStandardError();QString outputString = QString::fromLocal8Bit(output);appendLog("error:" + outputString);});connect(m_Process, &QProcess::stateChanged,[=](QProcess::ProcessState newState) {appendLog("stateChanged:" + QString::number(newState));});connect(m_Process, &QProcess::errorOccurred,[=](QProcess::ProcessError error) {appendLog("errorOccurred:" + QString::number(error));});connect(m_Process,static_cast<void (QProcess::*)(int exitCode,QProcess::ExitStatus exitStatus)>(&QProcess::finished),[=](int exitCode, QProcess::ExitStatus exitStatus) {appendLog("finished:" + QString::number(exitCode) + ":" +QString::number(exitStatus));});
}MainWindow::~MainWindow() {delete ui;
}void MainWindow::appendLog(const QString &text) {ui->textEdit->append(QString("%1:program=%2:pid=%3:%4").arg(QDateTime::currentDateTime().toString("yyyy/MM/dd hh:mm:ss.zzz")).arg(m_Process->program()).arg(m_Process->processId()).arg(text));
}void MainWindow::on_open_clicked() {QString pragramName =QFileDialog::getOpenFileName(nullptr, nullptr, QString());ui->program->setText(pragramName);
}void MainWindow::on_cmd_clicked() {if (ui->program->text().isEmpty()) return;m_Process->setProgram(ui->program->text());QStringList arguments;arguments << ui->arguments->text();m_Process->setArguments(arguments);m_Process->start();
}void MainWindow::on_clear_clicked() {ui->textEdit->clear();
}

ui:

編譯運行然后再對應輸入框輸入程序路徑以及對應參數,以剛剛寫的例子為例:

?然后關閉啟動的進程:

可以看到關閉后觸發了對應finished()信號,然后通過打印可以看到狀態從打開到關閉的變化情況是:1(Starting)->2(Running)->0(NotRunning) 。并且觸發finished()信號時由于進程已經關閉,所以獲取不到對應的進程id,但是stateChanged(NotRunning)會先于finished(),并且這時進程沒有完全關閉所有能獲取到對應進程id。也可以輸入一些cmd命令:

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

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

相關文章

Java面試——Redis

優質博文&#xff1a;IT-BLOG-CN 一、Redis 為什么那么快 【1】完全基于內存&#xff0c;絕大部分請求是純粹的內存操作&#xff0c;非常快速。數據存在內存中。 【2】數據結構簡單&#xff0c;對數據操作也簡單&#xff0c;Redis中的數據結構是專門進行設計的。 【3】采用單線…

【Vue3】全局切換字體大小

VueUse 先安裝VueUse <template><header><div class"left">left</div><div class"center">center</div><div class"right">right</div></header><div><button click"cha…

飛天使-學以致用-devops知識點4-SpringBoot項目CICD實現(實驗失敗,了解大概流程)

文章目錄 代碼準備創建jenkins 任務測試推送使用項目里面的jenkinsfile 進行升級操作 文字版本流程項目構建 代碼準備 推送代碼到gitlab 代碼去叩叮狼教育找 k8s 創建jenkins 任務 創建一個k8s-cicd-demo 流水線任務 將jenkins 里面構建時候的地址還有token&#xff0c; 給到…

azure devops工具實踐分析

對azure devops此工具的功能深挖&#xff0c;結合jira的使用經驗的分析 1、在backlog的功能描述&#xff0c;可理解為需求項&#xff0c;這里包括了bug&#xff0c;從開發的角度修復bug也是個工作項&#xff0c;所以需求的范圍是真正的需求&#xff08;開發接收到的已經確認的…

已解決org.springframework.web.multipart.MultipartException處理多部分請求異常的正確解決方法,親測有效!!!

已解決org.springframework.web.multipart.MultipartException處理多部分請求異常的正確解決方法&#xff0c;親測有效&#xff01;&#xff01;&#xff01; 目錄 問題分析 出現問題的場景 報錯原因 解決思路 解決方法 總結 在Web開發過程中&#xff0c;我們經常需要處…

基于JAVA協同過濾算法網上海鮮水產推薦購物商城系統設計與實現(Springboot框架)可行性分析

博主介紹&#xff1a;黃菊華老師《Vue.js入門與商城開發實戰》《微信小程序商城開發》圖書作者&#xff0c;CSDN博客專家&#xff0c;在線教育專家&#xff0c;CSDN鉆石講師&#xff1b;專注大學生畢業設計教育和輔導。 所有項目都配有從入門到精通的基礎知識視頻課程&#xff…

【PDF技巧】網上下載的pdf文件怎么才能編輯

不知道大家有沒有遇到過網上下載的PDF文件不能編輯的情況&#xff0c;今天我們來詳細了解一下導致無法編輯的原因即解決方法有哪些。 第一種原因&#xff1a;PDF文件中的內容是否是圖片&#xff0c;如果確認是圖片文件&#xff0c;那么我們想要編輯&#xff0c;就可以先使用PD…

分享經典、現代以及前沿軟件工程課程

https://www.icourse163.org/course/PKU-1003177002 隨著信息技術的發展&#xff0c;軟件已經深入到人類社會生產和生活的各個方面。軟件工程是將工程化的方法運用到軟件的開發、運行和維護之中&#xff0c;以達到提高軟件質量&#xff0c;降低開發成本的目的。軟件工程已經成為…

第三方支付牌照出讓,具備何種優勢的買方容易成功

在支付牌照并購的過程中&#xff0c;選擇一個合適的并購方是至關重要的。基于多年的支付牌照公司股權并購居間經驗&#xff0c;我發現具備以下特質的并購方在并購過程中表現得較為靠譜&#xff0c;他們不僅使得并購過程更為順暢&#xff0c;還能顯著提高并購的成功率。 并購方…

字符函數和字符串函數(下)

個人主頁&#xff08;找往期文章包括但不限于本期文章中不懂的知識點&#xff09;&#xff1a;我要學編程(?_?)-CSDN博客 目錄 strncpy函數的使用 函數原型&#xff1a; strncpy的使用 strncat函數的使用 函數原型&#xff1a; strncat的使用 strncmp函數的使用 函…

Vue3快速上手(十六)Vue3路由傳參大全

Vue3路由傳參 一、傳參的多種方式 1.1 拼接方式 這種方式適合傳遞單個參數的情況&#xff0c;比如點擊查看詳情&#xff0c;傳個id這樣的場景 傳參&#xff1a; <RouterLink to"/person?id1" active-class"active">person</RouterLink> …

Unity - 相機畫面為黑白效果

一、 在Hierarchy中創建一個Global Volume,并設置它為局部作用 二、 將場景出現的作用域范圍縮小至相機所在位置&#xff0c;將相機包含即可。 三、添加覆蓋組件Color Adjustments,并將Saturation直接拉為-100 。 此時&#xff0c;相機拍攝畫面為黑白&#xff0c;場景視圖中…

1、Linux-安裝

一、Linux和Windows的一些區別 1、Linux嚴格區分大小寫——【Windows創建文件夾時不區分大小寫】 2、Linux中所有內容都以文件形式存儲&#xff0c;包括硬件 3、Linux不靠拓展名區分文件類型&#xff0c;而是可以通過讀取文件開頭的一些字節來區分。 但是在實際使用中一般要…

MYSQL---日志

1.日志的概述 日志是MySQL數據庫的重要組成部分。日志文件中記錄著MySQL數據庫運行期間發生的變化&#xff1b;也就是說用來記錄MySQL數據庫的客戶端連接狀況、SQL語句的執行情況和錯誤信息等。當數據庫遭到意外的損壞時&#xff0c;可以通過日志查看文件出錯的原因&#xff0…

Leetcode算法題

用隊列實現棧 用隊列實現棧的四個操作&#xff1a; push(x)——元素x入棧pop()——移出棧頂元素top()——獲取棧頂元素empty()——返回棧是否為空 注意&#xff1a; 只能使用隊列的基本操作&#xff0c;即只可以調用隊列的push to back&#xff0c;pop from front&#xff…

C語言中的字符魔法:大小寫轉換的藝術

引言 在C語言的世界里&#xff0c;字符處理是一項基礎且重要的任務。字符作為編程中最基本的元素之一&#xff0c;承擔著信息展示、數據交互等多重角色。特別是在處理文本信息時&#xff0c;字符的轉換和識別顯得尤為重要。大小寫字母的轉換就是其中一個常見的需求&#xff0c…

電子電氣架構——汽車DoIP診斷通信建立流程

電子電氣架構——汽車DoIP診斷通信建立流程 我是穿拖鞋的漢子,魔都中堅持長期主義的工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 人們會在生活中不斷攻擊你。他們的主要武器是向你灌輸對自己的懷疑:你的價值、你的能力、你的潛力。他們往往會…

4款塞紙條盲盒交友源碼,可以對接公眾號

一元盲盒交友源碼/脫單盲盒源碼/交友盲盒/戀愛盲盒公眾號版 可以對接自己支付&#xff0c;全部自定義 沒有任何bug版本&#xff0c;已經測試完全可以 免費源碼&#xff0c;不包搭建指導 源碼下載地址專業知識分享社區-專業知識筆記免費分享 (chaobiji.cn)

華為OD機試 - 螺旋數字矩陣

1 題目描述 疫情期間&#xff0c;小明隔離在家&#xff0c;百無聊賴&#xff0c;在紙上寫數字玩。他發明了一種寫法&#xff1a; 給出數字個數 n &#xff08;0 < n ≤ 999&#xff09;和行數 m&#xff08;0 < m ≤ 999&#xff09;&#xff0c;從左上角的 1 開始&…

Globeland30米分辨率土地利用數據的下載

全國地理信息資源目錄服務系統 先注冊一下&#xff0c;登錄 點擊查詢