概 述
本文介紹,在Linux環(huán)境下,使用Qt中的QProcess類執(zhí)行shell命令并獲取輸出。
頭文件:#include <QProcess>
實(shí) 現(xiàn)
一、函數(shù)接口
QProcess類提供了三個函數(shù)
-
QProcess::execute()以堵塞方式的執(zhí)行shell命令,當(dāng)命令執(zhí)行完成后,調(diào)用進(jìn)程才會繼續(xù)執(zhí)行。命令輸出的任何數(shù)據(jù)都將轉(zhuǎn)發(fā)給調(diào)用進(jìn)程輸出(因此無法捕獲)。 -
QProcess::start()以異步方式的執(zhí)行shell命令,命令輸出的數(shù)據(jù)存儲于緩沖區(qū),可以通過readAllStandardOutput()捕獲 -
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)用外部程序。