C++ Qt開發(fā)之使用QProcess實現(xiàn)進(jìn)程管理
Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹如何運用QProcess
組件實現(xiàn)針對進(jìn)程的控制管理等。
當(dāng)你在使用Qt進(jìn)行跨平臺應(yīng)用程序開發(fā)時,經(jīng)常需要與外部進(jìn)程進(jìn)行交互,這時就可以利用Qt的QProcess
模塊。QProcess
模塊提供了啟動和控制外部進(jìn)程的功能,能夠執(zhí)行外部命令、運行其他可執(zhí)行文件,以及與外部進(jìn)程進(jìn)行通信。通過QProcess
,可以方便地執(zhí)行命令行命令、調(diào)用系統(tǒng)工具、執(zhí)行腳本等。QProcess
還可以捕獲外部進(jìn)程的輸出,以及監(jiān)視外部進(jìn)程的運行狀態(tài),從而實現(xiàn)更靈活、高效的進(jìn)程管理。
以下是QProcess
類的一些常用函數(shù)及其解釋的表格:
函數(shù) | 描述 |
---|---|
start(const QString &program, const QStringList &arguments) | 啟動一個新的進(jìn)程,program參數(shù)指定要執(zhí)行的程序,arguments參數(shù)指定傳遞給程序的參數(shù)列表。 |
startDetached(const QString &program, const QStringList &arguments) | 啟動一個新的進(jìn)程,但不會等待進(jìn)程退出,也不會將輸出傳遞給調(diào)用進(jìn)程。 |
waitForStarted(int msecs = 30000) | 等待進(jìn)程啟動,如果在指定時間內(nèi)進(jìn)程沒有啟動,將返回false。 |
waitForFinished(int msecs = 30000) | 等待進(jìn)程退出,如果在指定時間內(nèi)進(jìn)程沒有退出,將返回false。 |
readAllStandardOutput() | 讀取進(jìn)程的標(biāo)準(zhǔn)輸出,并返回為QByteArray。 |
readAllStandardError() | 讀取進(jìn)程的標(biāo)準(zhǔn)錯誤輸出,并返回為QByteArray。 |
write(const QByteArray &data) | 向進(jìn)程的標(biāo)準(zhǔn)輸入寫入數(shù)據(jù)。 |
closeWriteChannel() | 關(guān)閉進(jìn)程的標(biāo)準(zhǔn)輸入。 |
kill() | 終止進(jìn)程。 |
terminate() | 終止進(jìn)程。 |
start(const QString &program) | 啟動一個新的進(jìn)程,program參數(shù)指定要執(zhí)行的程序。 |
setWorkingDirectory(const QString &dir) | 設(shè)置進(jìn)程的工作目錄。 |
state() | 返回進(jìn)程的當(dāng)前狀態(tài)。 |
error() | 返回進(jìn)程的錯誤狀態(tài)。 |
pid() | 返回進(jìn)程的進(jìn)程ID。 |
waitForBytesWritten(int msecs = 30000) | 等待寫入到進(jìn)程的數(shù)據(jù)已經(jīng)被完全寫入。 |
waitForReadyRead(int msecs = 30000) | 等待進(jìn)程有數(shù)據(jù)可讀。 |
startDetached(const QString &program) | 啟動一個新的進(jìn)程,但不會等待進(jìn)程退出,也不會將輸出傳遞給調(diào)用進(jìn)程。 |
setProcessChannelMode(QProcess::ProcessChannelMode mode) | 設(shè)置進(jìn)程通信模式,可選值包括QProcess::SeparateChannels和QProcess::MergedChannels。 |
這些函數(shù)提供了控制進(jìn)程的各種方法,可以實現(xiàn)啟動、監(jiān)視、控制和與外部進(jìn)程進(jìn)行交互的功能。
進(jìn)程控制模塊可以實現(xiàn)對特定進(jìn)程的啟動關(guān)閉,本章將以執(zhí)行命令行為例,通過調(diào)用Start()
可以拉起一個第三方進(jìn)程。
QProcess
類的start()
函數(shù)有幾種不同的重載形式,但最常用的是以下形式:
bool QProcess::start( const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite )
函數(shù)用于啟動一個新的進(jìn)程,并執(zhí)行指定的程序(program
參數(shù))。arguments
參數(shù)指定了傳遞給程序的參數(shù)列表,它是一個QStringList
類型的參數(shù),可以為空。mode
參數(shù)指定了啟動進(jìn)程時打開的模式,默認(rèn)為ReadWrite
。函數(shù)返回一個bool
類型的值,表示進(jìn)程是否成功啟動。
當(dāng)調(diào)用start()
執(zhí)行命令后,我們則可以通過readAllStandardOutput()
函數(shù)從進(jìn)程的標(biāo)準(zhǔn)輸出中讀取所有可用的數(shù)據(jù),并將其返回為 QByteArray
對象。
QByteArray QProcess::readAllStandardOutput()
這個函數(shù)沒有參數(shù),它會立即返回當(dāng)前可用的標(biāo)準(zhǔn)輸出數(shù)據(jù),并將輸出數(shù)據(jù)作為字節(jié)數(shù)組返回。如果沒有可用的輸出數(shù)據(jù),它將返回一個空的字節(jié)數(shù)組。
當(dāng)然了,與之對應(yīng)的readAllStandardError()
是函數(shù),該函數(shù)可以用于從進(jìn)程的標(biāo)準(zhǔn)錯誤輸出中讀取所有可用的數(shù)據(jù),并將其返回為 QByteArray
對象。
QByteArray QProcess::readAllStandardError()
該函數(shù)同樣沒有參數(shù),它會立即返回當(dāng)前可用的標(biāo)準(zhǔn)錯誤輸出數(shù)據(jù),并將輸出數(shù)據(jù)作為字節(jié)數(shù)組返回。如果沒有可用的錯誤輸出數(shù)據(jù),它將返回一個空的字節(jié)數(shù)組。
獲取進(jìn)程信息
此處我們以輸出系統(tǒng)進(jìn)程信息為例,通??梢哉{(diào)用tasklist /FO CSV
來獲取系統(tǒng)中的進(jìn)程列表,并將其輸出為CSV
格式,通過調(diào)用如下函數(shù)則可以獲取到系統(tǒng)進(jìn)程信息。
process.start("tasklist", QStringList() << "/FO" << "CSV");
此時通過調(diào)用readAllStandardOutput
函數(shù)我們可以將緩沖區(qū)內(nèi)的數(shù)據(jù)讀出并將其放入到一個QString
類型變量內(nèi);
QString output = process.readAllStandardOutput();
當(dāng)具備了這個列表后,就可以根據(jù)冒號來逐行讀入并切割,通過循環(huán)的方式將其追加到treeWidget
組件內(nèi),并以此來實現(xiàn)展示的效果;
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"); // 跳過第一行標(biāo)題 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)); } } // 設(shè)置列標(biāo)題 ui->treeWidget->setHeaderLabels(QStringList() << "進(jìn)程名稱" << "PID" << "會話名稱" << "Session"<< "內(nèi)存占用"); } else { QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget); item->setText(0, "Failed to execute tasklist command."); } }
運行后當(dāng)點擊輸出系統(tǒng)進(jìn)程時則可以看到完整的進(jìn)程輸出效果,如下圖所示;
使用此方法我們可以很好的讀取到系統(tǒng)中的各種信息,只要能夠合理的過濾出想要的字段即可,當(dāng)需要輸出系統(tǒng)信息時我們可以通過process.start("systeminfo")
調(diào)用系統(tǒng)命令獲取到,如下代碼所示;
void MainWindow::on_pushButton_2_clicked() { ui->treeWidget->clear(); // 獲取系統(tǒng)信息 QProcess process; process.start("systeminfo"); if (process.waitForFinished()) { QByteArray output = process.readAllStandardOutput(); // 使用正確的文本編碼對輸出進(jìn)行解碼 QTextCodec *codec = QTextCodec::codecForName("GBK"); QString text = codec->toUnicode(output); QStringList lines = text.split("\n"); for (const QString &line : lines) { // 解析系統(tǒng)信息,添加到 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); } } // 設(shè)置列標(biāo)題 ui->treeWidget->setHeaderLabels(QStringList() << "系統(tǒng)信息" << "數(shù)值"); } else { QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget); item->setText(0, "Failed to execute systeminfo command."); } }
運行后當(dāng)用戶點擊輸出系統(tǒng)信息按鈕時,因systeminfo
運行時間較長所以需要等待一段時間,輸出效果如下圖所示;
到此這篇關(guān)于C++ Qt開發(fā)之使用QProcess實現(xiàn)進(jìn)程管理的文章就介紹到這了,更多相關(guān)Qt QProcess進(jìn)程管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++如何在主函數(shù)文件中調(diào)用其他函數(shù)文件
這篇文章主要介紹了c++如何在主函數(shù)文件中調(diào)用其他函數(shù)文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08C++實現(xiàn)LeetCode(647.回文子字符串)
這篇文章主要介紹了C++實現(xiàn)LeetCode(647.回文子字符串),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語言實現(xiàn)系統(tǒng)關(guān)機注銷功能
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)系統(tǒng)關(guān)機注銷功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02