簡述
QProcess可以用來啟動外部程式,並與它們互動。
要啟動一個進程,通過調用start()來進行,參數包含程式的名稱和命令列參數,參數作為一個QStringList的單個字串。
另外,也可以使用setProgram()和setArguments()來運行,然後調用start()或open()。
簡述 介面 樣本 cmd 啟動cmd cmd帶參數 cmd擷取傳回值 putty遠程登入 WinSCP遠程檔案傳輸 管道 錯誤處理 參數arguments 擷取環境變數
介面
start() 啟動外部程式
readAllStandardError() 從標準錯誤中擷取所有資料
readAllStandardOutput() 從標準輸出中擷取所有資料
write() 繼承於QIODevice
close() 繼承於QIODevice
除此之外,QProcess還包含靜態成員函數:
execute() 啟動一個進程,然後等待該進程結束。
startDetached() 啟動一個進程,然後使其和當前進程脫離進程的父子關係。 樣本 cmd 啟動cmd
QProcess process(this);process.startDetached("cmd.exe");
cmd帶參數
使用cmd來刪除本地檔案
QProcess process(this);process.start("cmd.exe");process.write ("del E:\\a.txt\n\r");process.write ("exit\n\r");process.waitForFinished();process.close();
cmd擷取傳回值
使用cmd來查看網路狀況
QStringList arguments;arguments << "/c" << "ping www.baidu.com";QProcess process(this);process.start("cmd.exe", arguments);process.waitForStarted();process.waitForFinished();QString strResult = QString::fromLocal8Bit(process.readAllStandardOutput());QMessageBox msgBox(this);msgBox.setText(strResult);msgBox.exec();
putty遠程登入
QString program = "E:/Putty.exe";QStringList arguments;arguments<< "-pw" << "wang" << QString("%1@%2").arg("root").arg("172.18.5.73") << "22";QProcess *process = new QProcess(this);process->setProcessChannelMode(QProcess::SeparateChannels);process->setReadChannel(QProcess::StandardOutput);process->start(program, arguments, QIODevice::ReadWrite);
WinSCP遠程檔案傳輸
QString program = QCoreApplication::applicationDirPath() + "/WinSCP/WinSCP.exe";QStringList arguments;arguments << QString("%1:%2@%3:%4").arg("root").arg("wang").arg("172.18.5.73").arg(22);QProcess *process = new QProcess(this);process->setProcessChannelMode(QProcess::SeparateChannels);process->setReadChannel(QProcess::StandardOutput);process->start(program, arguments, QIODevice::ReadWrite);
管道
一個進程的標準輸出資料流到目標進程的標準輸入。
command1 | command2
可以用下面代碼實現:
QProcess process1;QProcess process2;process1.setStandardOutputProcess(&process2);process1.start("command1");process2.start("command2");
錯誤處理
啟動外部程式,當發生錯誤時,可以根據指定的錯誤描述所發生的錯誤類型。
connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError(QProcess::ProcessError)));void processError(QProcess::ProcessError error){ switch(error) { case QProcess::FailedToStart: QMessageBox::information(0, "Tip", "FailedToStart"); break; case QProcess::Crashed: QMessageBox::information(0, "Tip", "Crashed"); break; case QProcess::Timedout: QMessageBox::information(0, "Tip", "Timedout"); break; case QProcess::WriteError: QMessageBox::information(0, "Tip", "WriteError"); break; case QProcess::ReadError: QMessageBox::information(0, "Tip", "ReadError"); break; case QProcess::UnknownError: QMessageBox::information(0, "Tip", "UnknownError"); break; default: QMessageBox::information(0, "Tip", "UnknownError"); break; }}
假設不存在對應的外部程式,則會返回錯誤類型QProcess::FailedToStart。 參數arguments
以putty遠程登入狀態例,putty可以使用命令列putty [-pw password] user@ip來進行串連。
所以中間為空白格的地方使用arguments進行單個字串分離:
QStringList arguments;arguments<< "-pw" << "wang" << QString("%1@%2").arg("root").arg("172.18.5.73");
其它參數類似。
QProcess process;process.start("del /s *.txt");//等同於process.start("del", QStringList() << "/s" << "*.txt");
擷取環境變數
返回調用進程的環境變數作為一個索引值對列表。
QStringList environment = QProcess::systemEnvironment();//environment = {"PATH=/usr/bin:/usr/local/bin", "USER=greg", "HOME=/home/greg"}