QProcess与外部程序的调用

    项目作到必定阶段,常常须要在原来的工程上调用外部程序。Qt为此提供了QProcess类,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。
例如:
html


  1. //1-不带空格,能够启动 并发

  2. process->start("F:/AppInst/115/115com/115com.exe");
    函数


  3. //2-带空格,没法启动 spa

  4. process->start("C:/Program Files/HaoZip/HaoZip.exe");
    .net


  5. //3-带空格,使用带参模式,能够启动 线程

  6. process->start("C:/Program Files/HaoZip/HaoZip.exe"QStringList("C:/Program Files/HaoZip/HaoZip.exe")); htm


2、启动以前须要作的工做:
    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官方自带的例子:
blog

  1. QObject *parent;
    继承

  2. ... 进程

  3. QString program = "./path/to/Qt/examples/widgets/analogclock";

  4. QStringList arguments;

  5. arguments << "-style" << "fusion";


  6. QProcess *myProcess = new QProcess(parent);

  7. myProcess->start(program, arguments);

    其实,start()或startDetached()已经整合了上面的三个步骤,若是须要分别设置,请采用以上的方式。

3、启动状态
    外部程序未启动时,其状态是NotRunning
    当启动时,其状态转变为Starting,正在启动,但此时还未调用起来;
    启动以后,继续变为Running,同时发射出started()信号,此时,能够对QProcess进行读写操做了;
    当退出时,其状态改成NotRunning,并发射出finished()信号。finishe()信号会携带退出码和退出状态,能够分别经过exitCode()和exitStatus()来得到。
    当发生错误时,QProcess会发出一个error()信号,一样的,也能够经过error()来得到其错误类型,经过state()得到当前程序的状态。

4、QProcess 与 QIODevice
    QProcess继承于QIODevice,所以,咱们能够把它看成是一个I/O设备进行读写操做。

5、交互
    QProcess有两种预约义的输出通道:标准输出stdout与标准错误stderr。
    经过setReadChannel()能够选择当前读取输出的通道。
    当通道中的数据准备就绪时,QProcess会发出readyRead()信号。若是是标准输出,则发出readyReadStandardOutput()信号;若是是标准错误,则发出readyReadStandardError()信号。
    经常使用的读取方式有read(), readAll()或getChar(),也能够经过readAllStandardOutput()和readAllStandardError()读取标准输出和标准错误通道中的数据。

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

6、Synchronous Process API (同步进程API)
    QProcess提供了一系列的函数以提到事件循环来完成同步操做:
(1)waitForStarted()          : 阻塞,直到外部程序启动
(2)waitForReadyRead()    : 阻塞,直到输出通道中的新数据可读
(3)waitForBytesWritten()  : 阻塞,直到输入通道中的数据被写入
(4)waitForFinished()        : 阻塞,直到外部程序结束
    若是在主线程(QApplication::exec())中调用这些函数,可能会形成当前用户界面不响应。

7、主要API
    请参考Qt的官方说明:QProcess Class


PS:参考连接
 从QProcess说开来(一) 
 从QProcess说开来(二) 


个人CSDN博客:http://blog.csdn.net/jan5_reyn

相关文章
相关标签/搜索