QProcess类用于启动外部程序并与它们通信。

要启动进程,请将要运行的程序的名称和命令行参数作为参数传递给start()。在字符串中以字符串形式提供。
或者,可以将程序设置为使用setProgram()和setArguments()运行,然后调用start()或open()。
例如,下面的代码片段通过在参数列表中传递包含“-style”和“Fusion”的字符串作为参数列表中的两个项来运行X11平台上Fusion样式的模拟时钟示例:

QObject *parent;
  ...
  QString program = "./path/to/Qt/examples/widgets/analogclock";
  QStringList arguments;
  arguments << "-style" << "fusion";


  QProcess *myProcess = new QProcess(parent);
  myProcess->start(program, arguments);

然后QProcess进入启动状态,当程序启动后,QProcess进入Running状态并发出started()信号。
QProcess允许您将进程视为顺序I/O设备。您可以像使用QTcpSocket访问网络连接一样对进程进行写操作和读取操作。然后可以通过调用write()写入进程的标准输入,并通过调用read()、readLine()和getChar()读取标准输出。因为它继承了QIODevice,所以QProcess还可以用作QXmlReader的输入源,或者用于生成要使用QNetworkAccessManager上载的数据。
当进程退出时,QProcess重新进入NotRunning状态(初始状态),并发出finished()。
finished()信号提供进程的退出代码和退出状态作为参数,您还可以调用exitCode()获取最后一个完成的进程的退出代码,调用exitStatus()获取其退出状态。如果在任何时间点发生错误,QProcess将发出erroroccurrent()信号。您还可以调用error()来查找上一次发生的错误类型,并调用state()来查找当前进程状态。

注意:VxWorks、iOS、tvOS、watchOS或通用Windows平台不支持QProcess。

Communicating via Channels

进程有两个预定义的输出通道:标准输出通道(stdout)提供常规控制台输出,而标准错误通道(stderr)通常提供进程打印的错误。这些通道代表两个独立的数据流。您可以通过调用setReadChannel()在它们之间切换。当数据在当前读取通道上可用时,QProcess发出readyRead()。当新的标准输出数据可用时,它也会发出readyReadStandardOutput(),当新的标准错误数据可用时,它也会发出readyReadStandardError()。您可以通过调用readAllStandardOutput()或readAllStandardError()来显式地从两个通道之一读取所有数据,而不是调用read()、readLine()或getChar()。
频道的术语可能会引起误解。请注意,进程的输出通道对应于QProcess的读通道,而进程的输入通道对应于QProcess的写通道。这是因为我们使用QProcess读取的内容是进程的输出,而我们编写的内容则成为进程的输入。
QProcess可以合并两个输出通道,这样来自运行进程的标准输出和标准错误数据都使用标准输出通道。在启动进程以激活此功能之前,使用MergedChannels调用setProcessChannelMode()。您还可以通过传递ForwardedChannels作为参数,将正在运行的进程的输出转发到调用的主进程。也可以只转发一个输出通道-通常一个通道将使用ForwardedErrorChannel,但ForwardedOutputChannel也存在。请注意,在GUI应用程序中使用通道转发通常是一个坏主意—您应该以图形方式显示错误。
某些过程需要特殊的环境设置才能运行。可以通过调用setProcessEnvironment()为进程设置环境变量。要设置工作目录,请调用setWorkingDirectory()。默认情况下,进程在调用进程的当前工作目录中运行。
属于用QProcess启动的GUI应用程序的窗口的位置和屏幕Z顺序由底层窗口系统控制。对于qt5应用程序,可以使用-qwindowgeometry命令行选项指定定位;X11应用程序通常接受-geometry命令行选项。
注意:在QNX上,由于操作系统的限制,设置工作目录可能会导致除QProcess调用线程之外的所有应用程序线程在生成过程中暂时冻结。

Synchronous Process API

QProcess提供了一组函数,允许在没有事件循环的情况下使用它,方法是挂起调用线程,直到发出某些信号:
waitForStarted()将阻止,直到进程启动。
waitForReadyRead()会阻塞,直到有新数据可以在当前读取通道上读取。
waitForBytesWrited()将阻塞,直到一个有效数据被写入进程。
waitForFinished()将阻止,直到进程完成。
从主线程(调用QApplication::exec()的线程)调用这些函数可能会导致用户界面冻结。
下面的示例运行gzip来压缩字符串“Qt rocks!”,没有事件循环:

QProcess gzip;
 gzip.start("gzip", QStringList() << "-c");
 if (!gzip.waitForStarted())
     return false;
 gzip.write("Qt rocks!");
 gzip.closeWriteChannel();
 if (!gzip.waitForFinished())
     return false;
 QByteArray result = gzip.readAll();

Notes for Windows Users

有些Windows命令(例如dir)不是由单独的应用程序提供的,而是由命令解释器本身提供的。如果您试图使用QProcess直接执行这些命令,它将无法工作。一种可能的解决方案是执行命令解释器本身(cmd.exe在某些Windows系统上),并要求解释器执行所需的命令。
另请参见QBuffer、QFile和QTcpSocket。