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;