QProcess类官方简介
目录运行过程通过通道通信同步进程APIWindows用户注意事项运行过程要启动进程需要将要运行的程序的名称和命令行参数作为参数传递给start()函数。设置参数的方式有两种:方式一,将参数保存在QStringList对象中;方式二,调用setProgram()函数和setArguments()函数进行设置。最后,调用start()函数或open()函数启动进程。例如,以下代码片段通过在参数列表中传
目录
运行过程
要启动进程需要将要运行的程序的名称和命令行参数作为参数传递给start()函数。设置参数的方式有两种:
- 方式一,将参数保存在QStringList对象中;
- 方式二,调用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);
调用start()函数或open()函数后QProcess进入启动状态,并且在程序启动后,QProcess进入运行状态并发出started()信号。
QProcess允许开发人员将进程视为顺序I/O设备——可以像使用QTcpSocket访问网络连接一样来写入和读取该进程。开发人员可以通过调用write()函数写入进程的标准输入,并通过调用read()函数,readLine()函数和getChar()函数读取标准输出。因为QProcess继承了QIODevice,所以它还可以用作QXmlReader的输入源,或生成要使用QNetworkAccessManager上载的数据。
当进程退出时,QProcess重新进入NotRunning状态(初始状态),并发出finish()信号。finish()信号将进程的退出代码和退出状态作为参数提供,开发人员还可以调用exitCode()函数获得最后完成的进程的退出代码,并调用exitStatus()函数获得其退出状态。如果在任何时间点发生错误,QProcess将发出errorOccurred()信号。开发人员还可以调用error()函数来查找最后发生的错误类型,并调用state()函数来查找当前进程状态。
注意:VxWorks,iOS,tvOS,watchOS或通用Windows平台不支持QProcess。
通过通道通信
进程具有两个预定义的输出通道:标准输出通道(stdout)提供常规控制台输出,而标准错误通道(stderr)通常提供由进程打印的错误。这些通道代表两个单独的数据流,可以通过调用setReadChannel()函数在它们之间切换。当前读取通道上有可用数据时,QProcess发出readyRead()信号。当有新的标准输出数据可用时,它也会发出readyReadStandardOutput()信号,而当有新的标准错误数据可用时,它会发出readyReadStandardError()信号。无需调用read()函数,readLine()函数或getChar()函数,而是可以通过调用readAllStandardOutput()函数或readAllStandardError()函数显式地从两个通道之一读取所有数据。
通道的术语可能会产生误导。请注意,进程的输出通道与QProcess的读取通道相对应,而进程的输入通道与QProcess的写入通道相对应。这是因为我们使用QProcess读取的内容是进程的输出,而我们编写的内容则成为进程的输入。
QProcess可以合并两个输出通道,因此运行过程中的标准输出和标准错误数据都使用标准输出通道。在启动激活此功能的过程之前,请使用MergedChannels调用setProcessChannelMode()函数。还可以选择通过传递ForwardedChannels作为参数,将正在运行的进程的输出转发到调用主进程。也可以只转发其中一个输出通道——通常一个将使用ForwardedErrorChannel,但ForwardedOutputChannel也存在。请注意,在GUI应用程序中使用通道转发通常不是一个好主意——应该以图形方式显示错误。
某些过程需要特殊的环境设置才能运行。调用setProcessEnvironment()函数可以为进程设置环境变量。调用setWorkingDirectory()函数可以为进程设置工作目录。默认情况下,进程在调用进程的当前工作目录中运行。
属于QProcess开头的GUI应用程序的窗口的位置和屏幕Z顺序由基础窗口系统控制。对于Qt 5应用程序,可以使用-qwindowgeometry命令行选项指定位置。 X11应用程序通常接受-geometry命令行选项。
注意:在QNX上,由于操作系统的限制,设置工作目录可能会导致所有应用程序线程(除QProcess调用程序线程之外)在生成过程中暂时冻结。
同步进程API
QProcess提供了一组可以在没有事件循环的情况下使用的函数(通过挂起调用线程直到发出某些信号):
waitForStarted()函数——阻塞直到进程开始。
waitForReadyRead()函数——阻塞直到有新数据可在当前读取通道上读取为止。
waitForBytesWritten()函数——阻塞直到将一个有效载荷数据写入该进程为止。
waitForFinished()函数——阻塞直到过程完成。
从主线程(调用QApplication::exec()函数的线程)调用这些函数可能会导致用户界面卡住。
以下示例运行gzip压缩字符串“ Qt rock!”,而没有事件循环:
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();
Windows用户注意事项
某些Windows命令(例如,dir)不是由单独的应用程序提供的,而是由命令解释器本身提供的。 如果您尝试使用QProcess直接执行这些命令,它将无法正常工作。 一种可能的解决方案是执行命令解释器本身(在某些Windows系统上为cmd.exe),然后要求解释器执行所需的命令。
更多推荐
所有评论(0)