QT的QProcess类用于管理外部进程的启动,同时可以根据QProcess::stateChanged(QProcess::ProcessState newState)信号监控程序的运行状态。
首先需要在.h头文件包含: #include<QProcess>;
声明QProcess对象: QProccess *m_pProcess;
然后在.cpp分配空间:m_pProcess = new QProcess(this);
启动程序分为,外部独立启动:m_pProcess->startDetached(AA.exe);和包含启动m_pProcess->start(AA.exe);,外部独立启动时,QT界面的程序输出栏会输出外部程序的调试内容,包含启动方式不显示。QT程序关闭时,包含启动的程序会自动跟随关闭,独立启动的程序仍然会独立运行,无影响。
程序启动内部调用cmd启动,直接运行AA.exe,系统无法找到该程序,需指定路径或者将AA.exe路径添加到系统环境中。
为保持QT程序良好的移植性,可以在程序启动时自动设置临时环境变量,只在QT程序运行时有效,设置完临时环境变量之后再启动m_pProcess。
void MainWindow::setEnvironment()
{
QString environmentPath = qgetenv("path"); //qgetenv函数获取系统环境变量
QString exepath = qApp->applicationDirpath(); //exe路径
exepath.append("/dependency"); //在QT程序的exe目录下新建dependency文件夹,放入需要启动的程序及环境
environmentPath += QDir::toNativeSeparators(exepath).prepend(';'); //QT自动获取的路径包含斜杠“/”,系统环境变量需要反斜杠“\”,toNativeSeparators函数自动将路径变为适应系统格式的路径;可以将需要运行的exe变量加到系统环境变量的最前边或者用append添加到最后边都可以
qputenv("path",environmentPath.toStdString().c_str()); //变换格式,然后存入系统环境变量,这样就可以临时添加系统环境变量了,QT程序退出后,环境变量也就消失了
}
获取启动的exe程序的运行状态可以添加connect监控:
connect(m_pProcess,&QProcess::stateChanged,this,&MainWindow::getProState);
信号分为三种,未运行、运行中、启动中。根据反馈的不同信号,监控exe程序运行状态并进行相应处理,这样可以确定是否打开或者关闭程序,是否可以write指令。
void MainWindow::getProState(QProcess::ProcessState state)
{
switch(state)
{
case QProcess::NotRunning: //exe程序未运行
{
qDebug()<<"exe程序未运行!";
}
break;
case QProcess::Starting: //exe程序启动中
{
qDebug()<<"exe程序启动中!";
}
break;
case QProcess::Running: //exe程序运行中
{
qDebug()<<"exe程序运行中!";
}
break;
default:
{
qDebug()<<"exe程序其他状态!";
}
break;
}
}
析构函数中需要删除建立的进程:
delete m_pProcess ;
m_pProcess = NULL;