项目做到一定阶段,经常需要在原来的工程上调用外部程序。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说开来(二)

我的CSDN博客:http://blog.csdn.net/jan5_reyn

http://www.quweiji.com/qprocess%E4%B8%8E%E5%A4%96%E9%83%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%B0%83%E7%94%A8/

QProcess与外部程序的调用(可以通过设置管道来交互)的更多相关文章

  1. Qt技巧:QProcess与外部程序的调用

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

  2. QProcess与外部程序的调用

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

  3. (转)python中调用R语言通过rpy2 进行交互安装配置详解

    python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753   python中调用R语言通过r ...

  4. 【转载】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍

    转载地址:http://blog.csdn.net/truong/article/details/46711045 关键字:Redis的Java客户端Jedis的八种调用方式(事务.管道.分布式…)介 ...

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

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

  6. [VB.NET]调用API获取/设置键盘按键状态

    1.调用GetAsyncKeyState()获取指定按键的状态,GetActiveKey()检索指定范围内的按键状态 2.调用keybd_event()可合成一次击键事件,通常两次击键事件间需要设定时 ...

  7. 调用相册怎么设置剪裁-b

    //创建一个相册控制器 UIImagePickerController *pc = [[UIImagePickerController alloc] init]; //图片来源// UIImagePi ...

  8. python调用函数超时设置

    1.Windows中sign报错,Linux能很好的使用: https://pypi.python.org/pypi/timeout-decorator 2.Windows可以使用,Linux报错不能 ...

  9. Python调用time模块设置当前时间-指定时间

    import datetimeimport time#新建元旦时间#将程序打包def A(): # 设定时间 newyear =datetime.datetime(2033,10,1) #调用当前时间 ...

随机推荐

  1. 国产编程语言R++ V1.5发布

    R++ v1.5内核改动较大,下面是一些主要变化: 1.使用PJIT(Pseudocode Just-In-Time),编译速度大幅提高,但运行效率远远不如C++,不过R++将在下一版本支持RJIT( ...

  2. Android 中万能的 BaseAdapter(Spinner,ListView,GridView) 的使用!

    大家好!今天给大家讲解一下BaseAdapter(基础适配器)的用法,适配器的作用主要是用来给诸如(Spinner,ListView,GridView)来填充数据的.而(Spinner,ListVie ...

  3. 用户向导页面实现左右滑动的ViewPager

    然后在一个博客,以前的博客ImageSwitcher实现用户向导,现在,随着ViewPager实现同样的功能.直接看代码: 布局文件activity_main.xml <RelativeLayo ...

  4. java 实现 一个账号只能在一个地方登陆,其他地方被下线

    其实方法有很多的,我这献丑了. 使用理解java 四大作用域. 思路:理解java 四大作用域的关键. 第一个地方登陆: 1.得到请求的SessionId 和 登陆的 用户名 2.把SessionId ...

  5. PHP学习笔记12-上传文件

    上传图片文件并在页面上显示出图片 enctype介绍:enctype属性指定将数据发回到服务器时浏览器使用的编码类型. 取值说明: multipart/form-data: 窗体数据被编码为一条消息, ...

  6. poj 2417

    Accepted 8508K 391MS C++ 2004B 相比下边,,优化太多太多了... /** baby-step-giant-step 因为数据量太大,,自己写hash **/ #inclu ...

  7. 嵌入式C开发人员的最好的0x10道笔试题

    嵌入式C开发人员的最好的0x10道笔试题 2006-11-22 15:53 约定: 1) 下面的测试题中,认为所有必须的头文件都已经正确的包含了 2)数据类型 char 一个字节 1 byte int ...

  8. 为Chrome添加https搜索 自定义地址栏搜索引擎

    转载 http://www.appinn.com/chrome-search-https-google/ 还可以参考一下 ://www.cnblogs.com/iftreasure/archive/2 ...

  9. NET Core Docker部署

    NET Core Docker部署 前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行 ...

  10. 64位linux下安装oracle10 64位 遇到 :ins_ctx.mk ;ins_emdb.mk

    http://blog.csdn.net/bamuta/article/details/10523835 http://www.cnblogs.com/kerrycode/p/3519446.html ...