QProcess类的作用是启动一个外部的程序并与之交互。我们不妨看看:一个普通的控制台程序,与外界是如何交互的
简单控制台程序
一个程序如何从外界获取信息并向外输出信息呢?
方向
|
途径
|
|
获取
|
命令行参数
|
intmain(intargc,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的派生类,故:
都可以直接用获取被调用程序的标准输出。
禁止缓冲
注意:如果写的控制台程序准备用于这种途径,且需要实时被读取标准输出,那么一般该程序内需要禁用缓冲
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实现一个命令行,粗略版本 博客地址:https://tinycool.blog.csdn.net/article/details/124397664
利用QProcess调用系统cmd程序实现ping功能,同时解决QT5中中文不能正常显示的问题
QT+QProcess+进程双向通信
qt使用QProcess实现父子进程通信
QProcess 实现父子进程间的双向通信。子进程获取父进程write发送的数据。windows下测试通过
演示QProcess的使用方法,在QT中直接打开word文档,并且考虑了指令中含有汉字的处理,和含有空格的处理。并考虑了内存释放
在做系统集成框架软件时,经常遇到需要将已有程序的界面嵌入到统一框架软件的情形,该示例程序演示了在Qt5平台下面,使用QProcess启动并嵌入带界面应用程序的方法。该方法在Windows、Linux等操作系统下测试通过,...
QT 中QProcess模块的较全面资料,适合于编程查询和学习
QT通过QProcess调用外部程序 博客地址:https://tinycool.blog.csdn.net/article/details/124359078
非常简单的代码,仅仅实现了qt调用mplayer,能播放代码包中提供的 0.mp3。亲测没问题。如果下载后不能正常播放,请检查mplayer是否能正常使用。
QT通过QProcess调用外部可执行程序,并将其嵌入到主窗口中.7z
Qt案例之利用QProcess类实现启动进程的功能进阶(以dos命令dir为例),详细内容可参考文章:https://blog.csdn.net/didi_ya/article/details/123180765
QT通过QProcess调用外部可执行程序,并将其嵌入到主窗口中,代码完整,可执行运行
使用qt5实现qprocess功能,亲测有效,希望对初学者有帮助
Qt5案例之利用QProcess获取计算机硬件信息,介绍利用QProcess获取计算机的CPU、主板、硬盘等电脑相关硬件信息。windows提供了“wmic”(Windows Management Instrumentation,Windows管理工具),提供了从命令行接口...
《C++ Qt开发:QProcess进程管理模块》文章课件
Qt6案例之利用QProcess获取计算机硬件信息,介绍利用QProcess获取计算机的CPU、主板、硬盘等电脑相关硬件信息。windows提供了“wmic”(Windows Management Instrumentation,Windows管理工具),提供了从命令行接口...
通过QProcess 调用 ffmpeg指令,检测max_volume小于0的文件,拿到文件列表,再通过ffmpeg指令来提高音频。
Qt实战案例之利用QProcess获取计算机硬件信息,可参考文章:https://blog.csdn.net/didi_ya/article/details/125129207
Qt实战案例之利用QProcess实现应用程序重启功能.zip,可参考文章:https://wendy.blog.csdn.net/article/details/126087475