一、启动外部程序的两种方式:
(1)一体式: void QProcess:: start( const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite )
外部程序启动后,将随主程序的退出而退出。
(2)分离式: void QProcess:: startDetached( const QString & program, const QStringList & arguments, const QString & workingDirectory = QString(), qint64 * pid = 0 )
外部程序启动后,当主程序退出时并不退出,而是继续运行。
值得注意的是,当程序路径中含有空格的时候,仅设置程序路径program是无法被识别的,解决方法是再将程序路径传递给 arguments。
例如:
- //1-不带空格,可以启动
- process->start("F:/AppInst/115/115com/115com.exe");
-
- //2-带空格,无法启动
- process->start("C:/Program Files/HaoZip/HaoZip.exe");
-
- //3-带空格,使用带参模式,可以启动
- process->start("C:/Program Files/HaoZip/HaoZip.exe", QStringList("C:/Program Files/HaoZip/HaoZip.exe"));
二、 启动之前需要做的工作:
To start a process, pass the name and command line arguments of the program you want to run as arguments to start(). Arguments are supplied as individual strings in a QStringList.
启动一个外部程序,需要传递外部程序的路径和执行参数,参数用QStringList来带入。
(1)设置路径: void QProcess:: setProgram( const QString & program )
(2)设置参数[可选]: void QProcess:: setArguments( const QStringList & arguments )
(3)启动: void QProcess::start(OpenMode mode = ReadWrite)
Qt官方自带的例子:
- QObject *parent;
- ...
- QString program = "./path/to/Qt/examples/widgets/analogclock";
- QStringList arguments;
- arguments << "-style" << "fusion";
-
- QProcess *myProcess = new QProcess(parent);
- myProcess->start(program, arguments);
三、启动状态
外部程序未启动时,其状态是 NotRunning ;
当启动时,其状态转变为 Starting ,正在启动,但此时还未调用起来;
启动之后,继续变为 Running ,同时发射出started()信号,此时,可以对QProcess进行读写操作了;
当退出时,其状态改为 NotRunning ,并发射出finished()信号。finishe()信号会携带退出码和退出状态,可以分别通过exitCode()和exitStatus()来获得。
当发生错误时,QProcess会发出一个error()信号,同样的,也可以通过error()来获得其错误类型,通过state()获得当前程序的状态。
四、QProcess 与 QIODevice
QProcess继承于QIODevice,因此,我们可以把它当作是一个I/O设备进行读写操作。
五、交互
QProcess有两种预定义的输出通道:标准输出stdout与标准错误stderr。
通过setReadChannel()可以选择当前读取输出的通道。
当通道中的数据准备就绪时,QProcess会发出readyRead()信号。如果是标准输出,则发出readyReadStandardOutput()信号;如果是标准错误,则发出readyReadStandardError()信号。
常用的读取方式有read(), readAll()或getChar(),也可以通过readAllStandardOutput()和readAllStandardError()读取标准输出和标准错误通道中的数据。
某些程序需要环境设置才能进行特殊的操作。可以通过setEnvironment()来设置环境变量,通过setWorkingDirectory()来设置工作目录,默认的 工作路径是当前调用程序的 工作路径。
六、Synchronous Process API (同步进程API)
QProcess提供了一系列的函数以提到事件循环来完成同步操作:
(1)waitForStarted() : 阻塞,直到外部程序启动
(2)waitForReadyRead() : 阻塞,直到输出通道中的新数据可读
(3)waitForBytesWritten() : 阻塞,直到输入通道中的数据被写入
(4)waitForFinished() : 阻塞,直到外部程序结束
如果在主线程(QApplication::exec())中调用这些函数,可能会造成当前用户界面不响应。
七、主要API
请参考Qt的官方说明: QProcess Class
PS:参考链接
从QProcess说开来(一)
转自:http://blog.csdn.net/jan5_reyn/article/details/40080953?utm_source=tuicool
==================================================================================================================================
在Qt4中,QProcess作为QIODevice的继承类,主要用来实现启动外部应用程序,并且进行进程间通信的。
调起外部程序,主要有两种方式: start()和startDetached()。这两种方式的区别是,start()后的进程与原有进程属于父子进程关系,当父进程退出后,被调起的进程也会结束;而startDetached()会在程序调起完成后,将这两个进程分离开来。
(1)
start()方法可以这样使用:
- QProcess *pProcess = new QProcess(this);
- pProcess->start(process_path);
(2)
startDetached()的方法可以这样使用():
- QProcess::startDetached(process_path);
bool | startDetached ( const QString & program, const QStringList & arguments, const QString & workingDirectory, qint64 * pid = 0 ) |
bool | startDetached ( const QString & program, const QStringList & arguments ) |
bool | startDetached ( const QString & program ) |
参数workingDirectory指定了程序运行的工作目录,当有数据输出时,会根据此来获得输出的相对路径及位置。
参数arguments应该是在该程序被启动后,用作数据传递吧;没有实践过这个参数,有待验证。
而这几个方法被设计为静态方法,很想知道这样设计的好处(免于创建对象外)和原理。
(3)对于QProcess的机制,大致可以理解为:在Qt4版本之前,QProcess是利用socket的双向通道机制实现了进程间的通信;但由于QProcess实际上只是实现了单向通信功能,浪费了socket的部分资源,在Qt4改用无名管道的通信机制(使用至少两个单向通信的管道来实现进程间通信)。
对于QProcess的应用场合,和信号/槽机制有点相对:信号/槽机制用于内部对象间通信;而QProcess则用于与外部对象通信,或所谓进程间通信。