从QProcess说开来(一)

Qt QProcess详解 QProcess提供了在 Qt 应用程序中启动外部程序的方法。通过QProcess,你可以启动一个进程,与它通信(发送输入和读取输出),检查它的状态,以及等待它完成。这个类在执行系统命令、运行其他程序或脚本时非常有用。 阅读详情

文章转载自 https://blog.youkuaiyun.com/dbzhang800/article/details/6876451

QProcess类的作用是启动一个外部的程序并与之交互。我们不妨看看:一个普通的控制台程序,与外界是如何交互的

简单控制台程序

一个程序如何从外界获取信息并向外输出信息呢?

方向

途径

 

获取

命令行参数

int main(int argc, char **argv)

标准输入

scanf()/getc()/getchar()/…

环境变量

getenv()

输出

标准输出

printf() …

标准出错

fprintf(stderr,…)

返回值

return(x)/exit(X)/_Exit(X)

命令行参数

大多控制台程序都接受命令行参数,一个例子:

#include <stdio.h>
int main(int argc, char **argv)
{
    for (int i=1; i<argc; ++i)
        printf("%s\n", argv[i]);
    return 0;
}

编译,调用程序时可指定命令行,结果:

$ ./process a b "c d"
a
b
c d

用QProcess调用外部程序时,可直接指定命令行参数

QProcess process;
process.start("./process", QStringList()<<"a"<<"b");
process.start("./process a b");

后一种写法看起来写起来比较简洁,但是程序路径或参数中包括空格时,就不如第一种方便了。

注:在Windows平台的某些情况(比如QTBUG7620)下,你可能需要使用

  • QProcess::setNativeArguments()


标准输出


对于控制台程序来说,这个可能是用的最多的了。比如上一个程序,我们遍历命令行参数,然后输到标准输出。

在控制台下,我们通常会使用重定向功能,比如:

$./process a b "c d" > out.txt 

在QProcess下,我们使用

QProcess::readAllStandardOutput ()

获取标准输出

QProcess::setStandardOutputFile()

设置输出到的文件,相当于前面的重定向

QProcess process;
process.start("./process", QStringList()<<"a"<<"b");
process.readAllStandardOutput();

可以使用:

  • QProcess::setStandardOutputProcess()

将标准输出作为另个进程的标准输入。形成 ls -l | more 这样的管道操作

由于QProcess是QIODevice的派生类,故:

  • read()
  • readLine()
  • …

都可以直接用获取被调用程序的标准输出。

禁止缓冲

注意:如果写的控制台程序准备用于这种途径,且需要实时被读取标准输出,那么一般该程序内需要禁用缓冲

int main()
{
setvbuf(stdout, (char *)NULL, _IONBF, 0);
return 0;
}

因为在控制台运行时,标准输出是行缓的。但是使用管道或重定向以后,一般就是全缓冲。在缓冲区写满或程序退出前,你可能看不到任何输出。

标准出错

相对于标准输出,这个东西大家似乎用的比较少了。

#include <stdio.h>

int main(int argc, char **argv)
{
    fprintf(stdout, "Hello STDOUT!\n");
    fprintf(stderr, "Hello STDERR!\n");
    return 0;
}

编译运行(注意区分两个流,标准出错的文件描述符是2):

$ ./process
Hello STDOUT!
Hello STDERR!
$ ./process > out.txt
Hello STDERR!
$ ./process > out.txt 2>err.txt
$

用QProcess读取标准出错,和前面标准输出是类似的:

  • QProcess::readAllStandardError()
  • QProcess::setStandardErrorFile()

QProcess process;
process.start("./process", QStringList()<<"a"<<"b");
process.readAllStandardOutput();

但是,QProcess作为QIODevice的派生类,read()/readAll()只能读标准输出,不读标准出错,有点说不过去哈。

恩QProcess在这方面足够灵活,你可以通过

  • QProcess::setReadChannel()

进行选择

标准输入

这个也不用多说,使用scanf()/gfets()等函数:

#include <stdio.h>

int main(int argc, char **argv)
{
    char contents[1024];
    fgets(contents, 1024, stdin);
    printf("output: %s", contents);
    return 0;
}

运行:

$ ./process 
1+1=2
output: 1+1=2

如果要输入的内容在文件内,也可以使用重定向

$ ./process < intput.txt
output: contents of input.txt

在QProcess中,直接使用QIODevice的write()函数

QProcess process;
process.start("./process")
process.write("intput");

也可以设置文件作为输入

  • QProcess::setStandardInputFile()


返回值


似乎很多人分不清返回值和标准输出的概念。

int main()
{
return 0;
}

也就是程序中 return X/exit(X) 等函数中指定的值了。

在Windows下,通过

C:\> process.exe
C:\> echo %errorlevel%

在Linux下,通过

$ ./process
$ echo $?

获得返回值。

在QProcess下,则通过:

  • int QProcess::execute()
  • int QProcess::exitCode()

获得返回值。

环境变量

程序运行时可以通过环境变量传递信息:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    char * path = getenv("MYPATH");
    printf("MYPATH= %s\n", path);
    return 1;
}

运行结果(Linux):

$ export MYPATH="/home/dbzhang800"
$ ./process
MYPATH= /home/dbzhang800

Windows下:

C:\> set MYPATH=E:\dbzhang800
C:\> process.exe
MYPATH= E:\dbzhang800

在Qt下,使用 QProcess::setProcessEnvironment() 设置进程的环境变量

QProcess process;
QProcessEnvironment env;
env.insert("MYPATH", "/home/dbzhang800");
process.setProcessEnvironment(env);
process.start("./process");

本来只是想简单提一下这部分,然后整理QProcess的其他部分的。没想到这点东西竟然弄了这么长,而且还都没敢展开。不管了,先这样吧。有时间慢慢写(二、三、四)。 20111015

Qt开发:QProcess的使用 QProcess 是 Qt 提供的一个类,用于 启动外部程序(子进程) 并与其进行交互,包括发送输入、读取输出和错误信息、控制进程状态等。它比 QSystem 调用更强大,适合需要持续与子进程通信的场景。 阅读详情

相关推荐

C++ QT调用外部程序(QProcess)

QT通过QProcess调用外部程序 博客地址:https://tinycool.blog.youkuaiyun.com/article/details/124359078

检查 QProcess 对象的状态的所有接口

通过使用这些方法,你可以监测和处理 QProcess 对象的状态,以便在外部进程启动、运行或退出时采取相应的措施。请根据你的具体需求选择合适的方法进行状态检查。

weixin_37718867的博客 1191

从PLC到机械臂:揭秘工业自动化中的信号交互与控制逻辑

本文深入解析了PLC与机械臂在工业自动化中的信号交互与控制逻辑,详细介绍了硬件连接方案、通信机制及控制逻辑设计。通过西门子PLC与六轴机械臂的实战案例,展示了从信号采集到动作执行的完整流程,并探讨了高级控制策略与行业应用前景,为工程师提供了一套完整的实践框架。

weixin_29304985的博客 387

QProcess的一些用法

转自:https://www.cnblogs.com/wang1994/p/5943154.html 初学QT开发 ,偶然读到,很有帮助。 QProcess 可用于完成启动外部程序,并与之交互通信。 一、启动外部程序的两种方式   1)一体式:void QProcess::start(const QString & program,const QStringList &arguments,OpenMode mode = ReadWrite)     外部程序启动后,将随主程序的退出而退出

Devour_的博客 2547

rk3576之imx415 4k@60fps

1;0;1;0;1;0;1;0;1;0;1;0;1;0;

darennet的专栏 704

Arduino程序设计(八)LCD显示实验

本文主要介绍温度/温湿度传感器的LCD显示实验,分别是:1、LM35采集环境温度LCD显示;2、DS18B20采集环境温度LCD显示;3、DHT11采集环境温湿度LCD显示。(1)LM35介绍LM35特性特性说明基本功能LM35作为常用的温度传感器,可以检测周围的温度工作原理利用感温材料,通过内部电路将温度值转化为对应的电压信号工作电压4~30V,常用5V供电温度测量测量范围0~100℃ ,误差 ±0.5℃输出信号线性模拟信号输出,LM35输出电压和摄氏温度程线性关系。

Alice的博客 6711

qprocess回调_从QProcess说开来(一)

QProcess类的作用是启动一个外部的程序并与之交互。我们不妨看看:一个普通的控制台程序,与外界是如何交互的简单控制台程序一个程序如何从外界获取信息并向外输出信息呢?方向途径获取命令行参数intmain(intargc,char**argv)标准输入scanf()/getc()/getchar()/...环境变量getenv()输出标准输出printf() ...标准出错fprintf(stde...

weixin_35831969的博客 391

从ROS2到ROS1:Lightning-LM激光SLAM模块的移植实践与核心代码解析

本文详细解析了将高性能激光SLAM算法Lightning-LM从ROS2移植到ROS1的完整实践过程。针对ROS1与ROS2在节点初始化、话题通信、参数服务器及TF发布等核心API的差异,文章提供了loc_system和slam模块的核心代码改造示例,并给出了适配catkin的CMakeLists.txt与package.xml配置方案,帮助开发者在现有ROS1生态中高效集成先进的SLAM模块。

weixin_29224529的博客 172

qprocess回调_从QProcess说开来(一) | 学步园

QProcess类的作用是启动一个外部的程序并与之交互。我们不妨看看:一个普通的控制台程序,与外界是如何交互的简单控制台程序一个程序如何从外界获取信息并向外输出信息呢?方向途径获取命令行参数intmain(intargc,char**argv)标准输入scanf()/getc()/getchar()/...环境变量getenv()输出标准输出printf() ...标准出错fprintf(...

weixin_28834169的博客 159

VS2015编译配置GDAL(图文并茂、超详细!!!)

文章目录一、GDAL介绍二、下载GDAL三、修改源代码四、工具命令提示符操作五、编译GDAL六、安装GDAL七、在VS2015的项目中配置GDAL八、添加环境变量九、测试是否配置成功 一、GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在XMIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。因此

weixin_46196863的博客 3756

蛋白质组学进阶指南 | (八)差异蛋白筛选与功能解析实战

本文是蛋白质组学差异蛋白筛选与功能解析的实战指南。详细讲解了如何利用R语言的limma包进行差异表达分析,结合FDR校正和差异倍数设定筛选关键蛋白,并通过火山图可视化结果。进一步介绍了使用clusterProfiler进行GO与KEGG功能富集分析,以及利用STRING数据库和Cytoscape构建蛋白互作网络以识别枢纽分子,最终串联分析形成可验证的生物学假说。

weixin_29208077的博客 737

从QProcess说开来

标签: windowsoutputlinuxpathqtnull 目录(?)[+] QProcess类的作用是启动一个外部的程序并与之交互。我们不妨看看:一个普通的控制台程序,与外界是如何交互的 简单控制台程序 一个程序如何从外界获取信息并向外输出信息呢? 方向 途径   获

攻城师 450

智护健康:基于 ESP32 的可穿戴式心率血氧远程监测手环设计与实现

随着健康管理理念的普及,可穿戴式健康监测设备成为刚需。本文设计了一款基于 ESP32 芯片的可穿戴式心率与血氧远程监测手环,通过集成专业生物传感器采集生理数据,借助 ESP32 的无线通信能力实现数据远程传输,搭配手机 APP 与云平台完成数据存储、分析与预警。文中详细阐述了硬件选型、模块接线、软件设计流程及核心代码实现,该手环具备低功耗、高精度、实时性强等特点,可满足日常健康监测与远程照护需求。

weixin_42300449的博客 1198

从QProcess说开来(二)

延续前面从QProcess说开来(一)的名字,换个角度继续学习。 QIODevice派生类 QProcess作为QIODevice的派生类,实现角度上看,它必须要重新实现下面两个成员函数: readData()writeData() 而后,按照QIODevic

1+1=10 2万+

C# 固高板卡(总线型) 操作类

主要功能有:初始化,轴使能,正负方向手动移动,回0,点到点移动,等待移动完成,输入IO数据读取,输出IO控制,清除报警等功能。

StevenChen的博客 571

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

QProcess

QProcess可以用于启动外部程序,具有两种方式。 一体式:QProcess::start 方法。 外部程序启动后,将随主程序的退出而退出。 貌似要使用QProcess的close方法才可以关闭启动的外部程序。 分离式:QProcess::startDetached 方法。 外部程序启动后,当主程序退出时并不退出,而是继续运行。 ...

weixin_43956958的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: Qt中用CSS对进度条的样式表进行设置(转w)
下一篇: 嵌入式 linux arm Qt支持jpg格式的图片
不是很大锅
博客等级 码龄10年 34粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值