简介
在使用QProcess调用外部程序时,可能会遇到两种场景:
1.调用起来之后就不管,直接运行后面的代码
2.调用起来后需要等待外部程序执行完成,在继续运行下面的代码
第一种
这种比较简单,新建一个进程设置好参数就可以了
QProcess *openProcess=new QProcess(this); //新建一个process进程
//绑定process进程完成信号,垃圾回收
connect(openProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[openProcess](int exitCode, QProcess::ExitStatus exitStatus){
Q_UNUSED(exitCode);
Q_UNUSED(exitStatus);
openProcess->close();
openProcess->kill();
openProcess->deleteLater();
});
command = "需要执行的命令";
//设置process输出的输出模式
openProcess->setReadChannelMode(QProcess::MergedChannels);
//设置工作路径
openProcess->setWorkingDirectory("工作空间");
//开始执行
openProcess->start(command,"需要添加的参数以QstrinfList方式传入");
//等待系统调度
openProcess->waitForStarted();
还有一种静态的调用方式,但注意,静态调用方式是阻塞的,要等到进程退出后才会继续执行后面的代码
int QProcess::execute(const QString &program, const QStringList &arguments)
第二种
若调用的外部程序执行完成后不会自动退出,需要用户按任意键才会退出,这时不管是使用静态调用方式还是调用QProcess::waitForFinished(int msecs = 30000)都会浪费大量的时间,waitForFinished默认等待三十秒,超时会自动杀死进程,当参数为-1时一直等待,直到进程结束。我以我遇到的一种情况距离,其他情况可参照
我需要调用的外部程序在执行完成后会输出“press enter key to stop”然后等待用户键入。那么解决思路就是捕捉进程输出,若输出中包含特定字符串时,就视为程序调用完毕
QString command="需要执行的命令" ;
QProcess geomprocess(this);
geomprocess.setWorkingDirectory("工作空间");
geomprocess.start(command);
geomprocess.waitForStarted();
QEventLoop loop; //创建一个事件循环,等待进程调用完毕
//绑定进程可以读取通道内容信号,当有可以读取的内容时,readyReadStandardOutput信号被发出
connect(&geomprocess,&QProcess::readyReadStandardOutput,this,[&loop,&geomprocess]()
{
//读取通道内所有内容
QString data=QString::fromLocal8Bit(geomprocess.readAllStandardOutput());
//判断读取到的内容是否包含特定字符串
if(data.contains("press enter key to stop"))
{
geomprocess.close();
geomprocess.kill();
loop.quit(); //杀死进程,退出事件循环
}
});
loop.exec();