项目做到一定阶段,常常须要在原来的project上调用外部程序。

Qt为此提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信。



一、启动外部程序的两种方式:

(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. //1-不带空格。能够启动
  2. process->start("F:/AppInst/115/115com/115com.exe");
  3. //2-带空格,无法启动
  4. process->start("C:/Program
    Files/HaoZip/HaoZip.exe");
  5. //3-带空格,使用带參模式。能够启动
  6. 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官方自带的样例:

  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()已经整合了上面的三个步骤。假设须要分别设置,请採用以上的方式。



三、启动状态

 
  外部程序未启动时。其状态是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说开来(一)

从QProcess说开来(二)

Qt技巧:QProcess与外部程序的调用的更多相关文章

  1. QProcess与外部程序的调用(可以通过设置管道来交互)

    项目做到一定阶段,经常需要在原来的工程上调用外部程序.Qt为此提供了QProcess类,QProcess可用于完成启动外部程序,并与之交互通信. 一.启动外部程序的两种方式:(1)一体式:void Q ...

  2. QProcess与外部程序的调用

    项目做到一定阶段,常常须要在原来的project上调用外部程序. Qt为此提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信. 一.启动外部程序的两种方式:(1)一体式: ...

  3. QT中QProcess调用命令行的痛苦经历(调用Winrar,设置工作目录,获得输出,注意引号与括号,等等)

    QT中QProcess调用命令行的痛苦经历   阅读目录 创建压缩包的方法 在QT中调用命令行 在QT中调用C++创建的dll 在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在Q ...

  4. Qt Designer设计 UI 文件并调用

    本文介绍的是Qt Designer设计 UI 文件并调用,在坛子里逛了一圈,关于UI方面的好像不怎多,本篇给大家分享一下. AD: 2013云计算架构师峰会超低价抢票中 Qt Designer设计 U ...

  5. Qt 中用QProcess调用cmd命令

    项目做到一定阶段,常常须要在原来的project上调用外部程序. Qt为此提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信. 基本用法: QProcess p(0); ...

  6. QT中QProcess调用命令行的痛苦经历

    在QT程序中需要将某些目录和文件压缩为一个rar的压缩包,于是想到了在QT中通过QProcess类调用命令行的rar.exe来达到效果,但是没想到QProcess类用起来很麻烦,而且达不到效果,折腾了 ...

  7. QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)

    最近这阵子,接了个私活,封装一个开发包俗称的SDK给客户调用,查阅了很多人家的SDK,绝大部分用VC编写,而且VC6.0居多,估计也是为了兼容大量的XP用户及IE浏览器,XP自带了VC6.0运行库,所 ...

  8. Qt之启动外部程序(调用cmd.exe ping putty winscp 管道等等,比较牛叉)

    http://blog.csdn.net/u011012932/article/details/50478833

  9. Qt之Qprocess

    QProcess 可用于完成启动外部程序,并与之交互通信. 一.启动外部程序的两种方式 1)一体式:void QProcess::start(const QString & program,c ...

随机推荐

  1. myeclipse svn配置

    在MyEclipse 9.0中安装SVN插件遇到一些问题,参考网上一些方法,最终解决.以下是个人认为比较简易的方法,供参考: 安装过程: (1)svn的插件版本site-1.8.14.zip(可根据自 ...

  2. android学习——MeasureSpec介绍及使用

    一.MeasureSpc类说明 SDK的介绍:MeasureSpc类封装了父View传递给子View的布局(layout)要求.每个MeasureSpc实例代表宽度或者高度 它有三种模式:①.UNSP ...

  3. 部署测试环境(ubuntu+mysql+tomcat)

    背景:入职新公司,广州这边没有测试开发环境,需要自己搭建一个:要求ubuntu+mysql+tomcat有具体版本要求:   2015/4/13 下载Ubuntu12.04 http://mirror ...

  4. 传统IT大佬们,路在何方?

    [文/ 任英杰] 2014年第一季度季报陆续出台,互联网公司无疑仍是璀璨明星,一路凯歌,而与互联网企业的蒸蒸日上形成鲜明对照的是传统IT企业的集体黯然失色.分析一下传统IT大佬们发布的数据,用友营业收 ...

  5. Hbase学习记录(1)|伪分布式安装

    概述 Hbase –Haddop Database 是一个高性能,高可靠性.面向列.可伸缩的分布式存储系统. Hbase利用HDFS作为文件存储系统,利用MapReduce来处理Hbase的海量数据, ...

  6. 一排下去再上来的div

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  7. dom 拖拽回放

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. cocos2d-x 3.2 椭圆运动

    直接上代码: // // OvalAction.h // LSWGameIOS // // Created by lsw on 14-10-27. // // #ifndef __LSWGameIOS ...

  9. java应用maven插件动态生成webservice代码

    pom.xml如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...

  10. hdu 4289 Control(最小割 + 拆点)

    http://acm.hdu.edu.cn/showproblem.php?pid=4289 Control Time Limit: 2000/1000 MS (Java/Others)    Mem ...