用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

QProcess类的作用是启动一个外部的程序并与之交互。我们不妨看看:一个普通的控制台程序,与外界是如何交互的简单控制台程序一个程序如何从外界获取信息并向外输出信息呢?方向途径 获取 启动一个外部exe程序示例 QProcess program; QString cmd = "C:\\meetsystem\\MeetClient\\bin\\MeetClient2.exe"; program.st 可用于完成启动外部程序,并与之交互通信。 一、启动外部程序的两种方式   1)一体式:void QProcess::start(const QString & program,const QStringList &arguments,OpenMode mode = ReadWrite)     外部程序启动后,将随主程序的退出而退出 方式一,将参数保存在QStringList对象中; 方式二,调用setProgram()函数和setArguments()函数进行设置。 最后,调用start()函数或open()函数启动进程。 例如,以下代码片段通过在参数列表中传递包含“ -style”和“ fusion”在X11平台上以Fusi.
QProcess是一个 Qt 库中的类,它允许开发人员启动和控制独立的程序。它可以被用来执行命令行程序、启动其他应用程序,以及通过管道与其他程序进行通信。 以下是一个简单的 QProcess 的例程: #include <QProcess> #include <QDebug> int main(int argc, char *argv[]) QProcess process; process.start("ls", QStringList() << "-l"); process.waitForFinished(); qDebug() << process.readAllStandardOutput(); return 0; 在这个例程中,我们使用 QProcess 启动了一个 `ls` 程序,并等待它结束。最后,我们读取它的标准输出,并使用 `qDebug` 将其打印到控制台。