在 Qt 中,我们使用来表示一个进程。这个类可以允许我们的应用程序开启一个新的外部程序,并且与这个程序进行通讯。下面我们用一个非常简单的例子开始我们本章有关进程的阐述。

    这是一段 Qt5 的程序,并且仅能运行于 Windows 平台。简单来说,这段程序通过 Qt 开启了一个新的进程,这个进程相当于执行了下面的命令:

    注意,我们可以在上面的程序中找到这个命令的每一个字符。事实上,我们可以把一个进程看做执行了一段命令(在 Windows 平台就是控制台命令;在 Linux 平台(包括 Unix)则是执行一个普通的命令,比如 ls)。我们的程序相当于执行了 dir 命令,其参数是 C:\,这是由arguments数组决定的(至于为什么我们需要将 dir 命令作为参数传递给 cmd.exe,这是由于 Windows 平台的规定。在 Windows 中,dir 命令并不是一个独立的可执行程序,而是通过 cmd.exe 进行解释;这与 ls 在 Linux 中的地位不同,在 Linux 中,ls 就是一个可执行程序。因此如果你需要在 Linux 中执行 ls,那么program的值应该就是 ls )。

    上面的输出会根据不同机器有所不同。豆子是在 Windows 8.1 64位机器上测试的。

    为了开启进程,我们将外部程序名字(program)和程序启动参数(arguments)作为参数传给QProcess::start()函数。当然,你也可以使用setProgram()setArguments()进行设置。此时,QProcess进入Starting 状态;当程序开始执行之后,QProcess进入Running 状态,并且发出started()信号。当进程退出时,QProcess进入NotRunning状态(也是初始状态),并且发出finished()信号。finished()信号以参数的形式提供进程的退出代码和退出状态。如果发送错误,QProcess会发出信号

    QProcess允许你将一个进程当做一个顺序访问的 I/O 设备。我们可以使用write()函数将数据提供给进程的标准输入;使用read()readLine()或者getChar()函数获取其标准输出。由于QProcess继承自QIODevice,因此QProcess也可以作为QXmlReader的输入或者直接使用QNetworkAccessManager将其生成的数据上传到网络。

    通道的术语可能会引起误会。注意,进程的输出通道对应着的 通道,进程的输入通道对应着QProcess 通道。这是因为我们使用QProcess“读取”进程的输出,而我们针对QProcess的“写入”则成为进程的输入。QProcess还可以合并标准输出和标准错误通道,使用setProcessChannelMode()函数设置MergedChannels即可实现。

    另外,QProcess还允许我们使用setEnvironment()为进程设置环境变量,或者使用setWorkingDirectory()为进程设置工作目录。

    前面我们所说的信号槽机制,类似于前面我们介绍的QNetworkAccessManager,都是异步的。与QNetworkAccessManager不同在于,QProcess提供了同步函数: