简述
QProcess可以用来启动外部程序,并与它们交互。
要启动一个进程,通过调用start()来进行,参数包含程序的名称和命令行参数,参数作为一个QStringList的单个字符串。
另外,也可以使用setProgram()和setArguments()来运行,然后调用start()或open()。
接口
-
start() 启动外部程序
-
readAllStandardError() 从标准错误中获取所有数据
-
readAllStandardOutput() 从标准输出中获取所有数据
-
write() 继承于QIODevice
-
close() 继承于QIODevice
除此之外,QProcess还包含静态成员函数:
-
execute() 启动一个进程,然后等待该进程结束。
-
startDetached() 启动一个进程,然后使其和当前进程脱离进程的父子关系。
示例
cmd
启动cmd
1 QProcess process(this); 2 process.startDetached("cmd.exe");
cmd带参数
使用cmd来删除本地文件
1 QProcess process(this); 2 process.start("cmd.exe"); 3 process.write ("del E:\\a.txt\n\r"); process.write ("exit\n\r"); process.waitForFinished(); process.close();
cmd获取返回值
使用cmd来查看网络状况
1 QStringList arguments; 2 arguments << "/c" << "ping www.baidu.com"; 3 QProcess process(this); 4 process.start("cmd.exe", arguments); 5 process.waitForStarted(); 6 process.waitForFinished(); 7 QString strResult = QString::fromLocal8Bit(process.readAllStandardOutput()); 8 QMessageBox msgBox(this); 9 msgBox.setText(strResult); 10 msgBox.exec();
putty远程登录
1 QString program = "E:/Putty.exe"; 2 QStringList arguments; 3 arguments<< "-pw" << "wang" << QString("%1@%2").arg("root").arg("172.18.5.73"); 4 QProcess *process = new QProcess(this); 5 process->setProcessChannelMode(QProcess::SeparateChannels); 6 process->setReadChannel(QProcess::StandardOutput); 7 process->start(program, arguments, QIODevice::ReadWrite);
WinSCP远程文件传输
1 QString program = QCoreApplication::applicationDirPath() + "/WinSCP/WinSCP.exe"; 2 QStringList arguments; 3 arguments << QString("%1:%2@%3:%4").arg("root").arg("wang").arg("172.18.5.73").arg(22); 4 QProcess *process = new QProcess(this); 5 process->setProcessChannelMode(QProcess::SeparateChannels); 6 process->setReadChannel(QProcess::StandardOutput); 7 process->start(program, arguments, QIODevice::ReadWrite);
管道
一个进程的标准输出流到目标进程的标准输入。
command1 | command2
可以用下面代码实现:
1 QProcess process1; 2 QProcess process2; 3 4 process1.setStandardOutputProcess(&process2); 5 6 process1.start("command1"); 7 process2.start("command2");
错误处理
启动外部程序,当发生错误时,可以根据指定的错误描述所发生的错误类型。
1 connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError(QProcess::ProcessError))); 2 3 void processError(QProcess::ProcessError error) 4 { 5 switch(error) 6 { 7 case QProcess::FailedToStart: QMessageBox::information(0, "Tip", "FailedToStart"); 8 break; 9 case QProcess::Crashed: 10 QMessageBox::information(0, "Tip", "Crashed"); 11 break; 12 case QProcess::Timedout: 13 QMessageBox::information(0, "Tip", "Timedout"); 14 break; 15 case QProcess::WriteError: 16 QMessageBox::information(0, "Tip", "WriteError"); 17 break; 18 case QProcess::ReadError: 19 QMessageBox::information(0, "Tip", "ReadError"); 20 break; 21 case QProcess::UnknownError: 22 QMessageBox::information(0, "Tip", "UnknownError"); 23 break; 24 default: 25 QMessageBox::information(0, "Tip", "UnknownError"); 26 break; 27 } 28 } 29 30 31 假设不存在对应的外部程序,则会返回错误类型 32 QProcess::FailedToStart
参数arguments
以putty远程登录为例,putty可以使用命令行putty [-pw password] user@ip
来进行连接。
所以中间为空格的地方使用arguments进行单个字符串分离:
1 QStringList arguments; 2 arguments<< "-pw" << "wang" << QString("%1@%2").arg("root").arg("172.18.5.73");
其它参数类似。
1 QProcess process; 2 process.start("del /s *.txt"); 3 //等同于process.start("del", QStringList() << "/s" << "*.txt");
获取环境变量
返回调用进程的环境变量作为一个键值对列表。
1 QStringList environment = QProcess::systemEnvironment(); 2 //environment = {"PATH=/usr/bin:/usr/local/bin", "USER=greg", "HOME=/home/greg"}