C++ Qt開發(fā)之使用QProcess實現(xiàn)進(jìn)程管理
Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹如何運(yùn)用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í)行外部命令、運(yùn)行其他可執(zhí)行文件,以及與外部進(jìn)程進(jìn)行通信。通過QProcess,可以方便地執(zhí)行命令行命令、調(diào)用系統(tǒng)工具、執(zhí)行腳本等。QProcess還可以捕獲外部進(jìn)程的輸出,以及監(jiān)視外部進(jìn)程的運(yù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.");
}
}
運(yùn)行后當(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.");
}
}
運(yùn)行后當(dāng)用戶點擊輸出系統(tǒng)信息按鈕時,因systeminfo運(yùn)行時間較長所以需要等待一段時間,輸出效果如下圖所示;

到此這篇關(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-08
C++實現(xiàn)LeetCode(647.回文子字符串)
這篇文章主要介紹了C++實現(xiàn)LeetCode(647.回文子字符串),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語言實現(xiàn)系統(tǒng)關(guān)機(jī)注銷功能
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)系統(tǒng)關(guān)機(jī)注銷功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02

