QT启动外部程序、运行状态监控、搭建运行环境(学习记录)-程序员宅基地

技术标签: qt  开发语言  

        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;

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_28178271/article/details/128436447

智能推荐

Conflux人物志-杨光博士:徜徉在密码学中的“宝藏男孩”-程序员宅基地

文章浏览阅读531次。说起密码学,大多数人最先联想到的可能是波诡云谲的谍战,为了取得对方密码不惜一切代价的特工;或许也有人会想到二战时期的布莱奇利公园,年轻的图灵带领着一群天才数学家成功破解了..._密码专家阳光

面向对象-静态变量与单例设计模式_单例模式,使用static 变量-程序员宅基地

文章浏览阅读449次。1. Static1.1 什么是Staticstatic:静态的static可以用来修饰:方法、属性、代码块、内部块1.2 Static的使用1.2. 1static修饰属性:静态变量;属性:按是否使用static修饰,又分为静态变量 vs 非静态变量实例变量:当我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性,当修改其中一个对象中的非静态属性时,不会导致其它对象中同样的属性值修改静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量,当通过某一个对_单例模式,使用static 变量

哈希表——python-程序员宅基地

文章浏览阅读560次,点赞9次,收藏5次。insert(key,value): 插入键值对(key,value)get(key): 如果存在键为key的键值对则返回其value,否则返回空值delete(key): 删除键对key的键值对。

Unity3D控制物体前后左右移动、旋转及相机跟随_unity让物体左旋转a-程序员宅基地

文章浏览阅读2.6w次,点赞3次,收藏33次。Input.GetKey 获取键,当按键北被用户按住时返回true。下面代码实现:按下"W" 控制物体向前;按下"A"控制物体像左;按下"S"控制物体向后;按下"D"控制物体向右;按下"Q"控制物体向左旋转;按下”E"控制物体向右旋转; 把脚本拖给一个物体,再给相机一个SmoothFollow脚本。就可以运行看效果了。注意:如果你的工程文件中没有_unity让物体左旋转a

银河麒麟V10操作系统之root密码重置_银河麒麟root默认密码-程序员宅基地

文章浏览阅读3w次,点赞16次,收藏96次。从kingbase工程师那拷贝了一个已经安装了kingbase数据库环境的虚拟机,只有一个kingbase普通账户,root密码位置,且该账户未加入到sudo组中,无法执行新软件等的安装和部署。为了满足需要,我们需要重置root密码。_银河麒麟root默认密码

Opencv3安装踩坑(SLAM十四讲)_/usr/include/opencv-程序员宅基地

文章浏览阅读5.5k次,点赞3次,收藏57次。因为之前玩ros,使用了sudo apt-get install libopencv-dev 安装了opencv2,而slam十四讲的opencv版本为3。因此需要重新安装opencv3(在与opencv2共存的条件下)首先检查已有的opencv版本:pkg-config opencv --modversion如果是2版本,则需要安装3版本1. 安装过程1.安装依赖(如果有依赖则不必..._/usr/include/opencv

随便推点

“大数据”助银行业监管-程序员宅基地

文章浏览阅读163次。基于数据大集中的监管手段——现场检查系统(EAST系统)应运而生。现在,运用EAST系统进行建模分析,从系统中直接筛选符合条件的信息,实时跟踪数据异动,仅用一分钟就能迅速筛查出过去需要好几天才能查出来的贷款挪作保证金等违规情况,现场检查质效得到大幅提升。  这一系统已经在提升监管..._银行监管各 主题

佩服!这个程序员用Raspberry Pi搭了一个计算机实验室!-程序员宅基地

文章浏览阅读150次。Raspberry Pi是一款迷你电脑,主要针对的人群是非技术的其他电脑使用人群,由于其低廉的价格,在教育领域非常受欢迎。虽然程序员很少使用这款电脑,但Raspberry Pi的功能十分强悍。据国外媒体报道,一家位于英国剑桥的咨询公司PA Consulting成功利用开源硬件Raspberry Pi个人电脑以及配套软件模拟移动信号基站,并实现了所有移动信号基站的功能。近日,Raspberry Pi..._学校计算机上的raspberry pi教育手册

MatconvNet:尝试将 SCRIPT vl_nnconv 作为函数执行_尝试将 script vl_nnconv 作为函数执行:-程序员宅基地

文章浏览阅读5k次,点赞7次,收藏7次。运行matconvnet遇到下面问题:尝试将 SCRIPT vl_nnconv 作为函数执行:L:\Fine-tuning-CNN\matlab\cnnimageretrieval\matlab\vl_nnconv.m出错 dagnn.Conv/forward (line 11)outputs{1} = vl_nnconv(...出错 dagnn.Layer/forwardAdvanced (line 85)outputs = obj.forward(inputs, {net.params(_尝试将 script vl_nnconv 作为函数执行:

Thymeleaf怎么显示request中绑定的数据?_thyme 显示request的值-程序员宅基地

文章浏览阅读1.1k次。Thymeleaf怎么显示request中绑定的数据?后端代码:@Controllerpublic class test { @RequestMapping({"/test"}) public String test(HttpServletRequest httpServletRequest){ //使用setAttribute存入数据 httpServletRequest.setAttribute("zhang" , "zhangjiahong"); _thyme 显示request的值

VSCode之Markdown自动生成目录#TOC#解决目录不整齐问题_vscode markdown 表格显示不全-程序员宅基地

文章浏览阅读3.1k次,点赞8次,收藏3次。一 、下载插件(1)在扩展里,搜索“Markdown”,在列表里选择Markdown的插件。(2)例如“Markdown TOC”,这是一个专门生产目录的插件。点击安装二、生成目录在你想添加目录的地方右击选择“Markdown TOC:Insert/Update”三、可能出现的问题及解决VSCode中Markdown目录显示异常TOC标签格式异常出现如下auto的文字原因:默..._vscode markdown 表格显示不全

MediaServerStudioEssentials2017R2版本安装_media server studio community 2017-程序员宅基地

文章浏览阅读1.1k次。安装依赖sudo apt-get install -y preload libpciaccess-dev libpthread-stubs0-devsudo apt-get install -y compizconfig-settings-managersudo apt-get install -y subversion git git-svn gcc g++ make cmake nasms_media server studio community 2017