Qt QProcess

概 述

本文介紹,在Linux環(huán)境下,使用Qt中的QProcess類執(zhí)行shell命令并獲取輸出。
頭文件:#include <QProcess>

實(shí) 現(xiàn)

一、函數(shù)接口
QProcess類提供了三個函數(shù)

  1. QProcess::execute() 以堵塞方式的執(zhí)行shell命令,當(dāng)命令執(zhí)行完成后,調(diào)用進(jìn)程才會繼續(xù)執(zhí)行。命令輸出的任何數(shù)據(jù)都將轉(zhuǎn)發(fā)給調(diào)用進(jìn)程輸出(因此無法捕獲)。
  2. QProcess::start() 以異步方式的執(zhí)行shell命令,命令輸出的數(shù)據(jù)存儲于緩沖區(qū),可以通過readAllStandardOutput()捕獲
  3. QProcess::startDetached() 以分離的方式執(zhí)行shell命令,調(diào)用進(jìn)程退出,則分離的進(jìn)程將繼續(xù)運(yùn)行,而不受影響。

二、執(zhí)行命令
這里主要介紹execute()start()

//無參數(shù)的shell命令
QProcess p;
p.execute("pwd")  //執(zhí)行pwd命令

//有參數(shù)的shell命令
QProcess p;
p.execute("ifconfig", {-a})  //執(zhí)行ifconfig -a命令

QStringList  list;  
list << "-a";  
p.execute("ifconfig", list); //以QStringList傳遞參數(shù)

execute()會將命令輸出直接打印到控制臺,調(diào)用程序無法捕獲。

//無參數(shù)的shell命令
QProcess p;
p.start("pwd")  //執(zhí)行pwd命令

//有參數(shù)的shell命令
QProcess p;
p.start("ifconfig", {-a})  //執(zhí)行ifconfig -a命令

QStringList  list;  
list << "-a";  
p.start("ifconfig", list); //以QStringList傳遞參數(shù)

//結(jié)果捕獲
p.waitForFinished(); //等待shell命令執(zhí)行完成
QString  str = p.readAllStandardOutput(); //捕獲輸出
qDebug() << str;

調(diào)用程序可通過readAllStandardOutput()捕獲shell命令的輸出

三、管 道
對于shell命令中的|,直接傳入?yún)?shù)是不行的。

//查看CUP ID命令
sudo dmidecode -t 4 | grep ID |sort -u |awk -F': ' '{print $2}'
QProcess p;
p.start("dmidecode -t 4 | grep ID |sort -u |awk -F': ' '{print $2}'");

以上的方式是無法執(zhí)行的。
可以將整個命令作為sh的參數(shù)傳入 或 使用QProcess::setStandardOutputProcess(QProcess *destination)即將一個進(jìn)程的標(biāo)準(zhǔn)輸出流傳入目標(biāo)進(jìn)程的標(biāo)準(zhǔn)輸入流

//將整個命令作為sh的參數(shù)傳入
QProcess p;
p.start("sh", QStringList() << "-c" << "dmidecode -t 4 | grep ID |sort -u |awk -F': ' '{print $2}'");
p.waitForFinished();
QString str = p.readAllStandardOutput();
qDebug() << str;

//使用setStandardOutputProcess()
QProcess process1;                                
QProcess process2;                                
QProcess process3;                                
QProcess process4;                                
                                                  
process1.setStandardOutputProcess(&process2);     
process2.setStandardOutputProcess(&process3);     
process3.setStandardOutputProcess(&process4);     
                                                  
process1.start("sudo fdisk -l");                  
process2.start("grep ID");                        
process3.start("sort -u");                        
process4.start("awk", {"-F", ": ", "{print $2}"});
                                                  
process4.waitForFinished(); //等待最后一個命令執(zhí)行完成               
QString str = process4.readAllStandardOutput();     
qDebug() << str;                                    

對于需要sudo權(quán)限的命令,需要使用sudo權(quán)限打開qtcreator,或者直接在命令前加上sudo(不建議)。

當(dāng)然,QProcess不僅僅可以執(zhí)行shell命令,也可以用于執(zhí)行調(diào)用外部程序。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容