QProcess与外部程序的调用

来源:互联网 发布:初中物理怎么学 知乎 编辑:程序博客网 时间:2024/06/08 14:14

   Qt提供的QProcess类,可用于启动外部程序,并与之交互通信。

1.启动外部程序的两种方式

       (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"));

2.启动之前须要做的工作

  启动一个外部程序,须要传递外部程序的路径和运行参数。参数用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);
     事实上,start()或startDetached()已经整合了上面的三个步骤。假设须要分别设置,请采用以上的方法。
   

3.启动状态

  外部程序未启动时。其状态是NotRunning;

  当启动时,其状态转变为Starting,正在启动。但此时还未调用起来。

  启动之后,其状态变为Running,同一时刻发射出started()信号,此时,能够对QProcess进行读写操作了。

  当退出时,其状态改为NotRunning。并发射出finished()信号。finished信号会携带退出码和退出状态,能够分别通过exitCode()和exitStatus()来获得。

  当错误发生时,QProcess会发出一个error()信号。相同的,也能够通过error()来获得其错误类型,通过state()获得当前程序的状态。

  

4.交互

    QProcess有两种提前定义的输出通道:标准输出stdout与标准错误stderr。

    通过setReadChannel()能够选择当前读取输出的通道。

    当通道中的数据准备就绪时。QProcess会发出readyRead()信号。假设是标准输出。则发出readyReadStandardOutput()信号。假设是标准错误,则发出readyReadStandardError()信号。

    经常使用的读取方式有read(), readAll()或getChar(),也能够通过readAllStandardOutput()和readAllStandardError()读取标准输出和标准错误通道中的数据。

    某些程序须要环境设置才能进行特殊的操作。能够通过setEnvironment()来环境变量设置,通过setWorkingDirectory()来设置工作文件夹,默认的工作路径是当前调用程序的工作路径。


5.Synchronous Process API(同步进程API)

   QProcess提供了一系列的函数以提到事件循环来完毕同步操作:

      (1)waitForStarted(): 堵塞。直到外部程序启动

      (2)waitForReadyRead(): 堵塞,直到输出通道中的新数据可读

      (3)waitForBytesWritten(): 堵塞,直到输入通道中的数据被写入

      (4)waitForFinished(): 堵塞,直到外部程序结束

   假设在主线程(QApplication::exec())中调用这些函数,可能会造成当前用户界面不响应。


本文转载于:

    http://www.cnblogs.com/mengfanrong/p/5341512.html

原创粉丝点击