簡(jiǎn)述
QProcess可以用來(lái)啟動(dòng)外部程序,并與它們交互。
要啟動(dòng)一個(gè)進(jìn)程,通過(guò)調(diào)用start()來(lái)進(jìn)行,參數(shù)包含程序的名稱和命令行參數(shù),參數(shù)作為一個(gè)QStringList的單個(gè)字符串。
另外,也可以使用setProgram()和setArguments()來(lái)運(yùn)行,然后調(diào)用start()或open()。
接口
除此之外,QProcess還包含靜態(tài)成員函數(shù):
示例
cmd
啟動(dòng)cmd
QProcess process(this);
process.startDetached("cmd.exe");
cmd帶參數(shù)
使用cmd來(lái)刪除本地文件
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來(lái)查看網(wǎng)絡(luò)狀況
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遠(yuǎn)程登錄
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遠(yuǎn)程文件傳輸
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);
管道
一個(gè)進(jìn)程的標(biāo)準(zhǔn)輸出流到目標(biāo)進(jìn)程的標(biāo)準(zhǔn)輸入。
command1 | command2
可以用下面代碼實(shí)現(xiàn):
QProcess process1;
QProcess process2;
process1.setStandardOutputProcess(&process2);
process1.start("command1");
process2.start("command2");
錯(cuò)誤處理
啟動(dòng)外部程序,當(dāng)發(fā)生錯(cuò)誤時(shí),可以根據(jù)指定的錯(cuò)誤描述所發(fā)生的錯(cuò)誤類型。
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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
假設(shè)不存在對(duì)應(yīng)的外部程序,則會(huì)返回錯(cuò)誤類型QProcess::FailedToStart 。
參數(shù)arguments
以putty遠(yuǎn)程登錄為例,putty可以使用命令行putty [-pw password] user@ip 來(lái)進(jìn)行連接。
所以中間為空格的地方使用arguments進(jìn)行單個(gè)字符串分離:
QStringList arguments;
arguments<< "-pw" << "wang" << QString("%1@%2").arg("root").arg("172.18.5.73");
其它參數(shù)類似。
QProcess process;
process.start("del /s *.txt");
//等同于process.start("del", QStringList() << "/s" << "*.txt");
獲取環(huán)境變量
返回調(diào)用進(jìn)程的環(huán)境變量作為一個(gè)鍵值對(duì)列表。
QStringList environment = QProcess::systemEnvironment();
//environment = {"PATH=/usr/bin:/usr/local/bin", "USER=greg", "HOME=/home/greg"}
|