QProcess类用于启动外部程序并与它们通信。

要启动进程,请将要运行的程序的名称和命令行参数作为参数传递给start()。在字符串中以字符串形式提供。
或者,可以将程序设置为使用setProgram()和setArguments()运行,然后调用start()或open()。
例如,下面的代码片段通过在参数列表中传递包含“-style”和“Fusion”的字符串作为参数列表中的两个项来运行X11平台上Fusion样式的模拟时钟示例:

 QObject *parent;...QString program = "./path/to/Qt/examples/widgets/analogclock";QStringList arguments;arguments << "-style" << "fusion";QProcess *myProcess = new QProcess(parent);myProcess->start(program, arguments);

然后QProcess进入启动状态,当程序启动后,QProcess进入Running状态并发出started()信号。
QProcess允许您将进程视为顺序I/O设备。您可以像使用QTcpSocket访问网络连接一样对进程进行写操作和读取操作。然后可以通过调用write()写入进程的标准输入,并通过调用read()、readLine()和getChar()读取标准输出。因为它继承了QIODevice,所以QProcess还可以用作QXmlReader的输入源,或者用于生成要使用QNetworkAccessManager上载的数据。
当进程退出时,QProcess重新进入NotRunning状态(初始状态),并发出finished()。
finished()信号提供进程的退出代码和退出状态作为参数,您还可以调用exitCode()获取最后一个完成的进程的退出代码,调用exitStatus()获取其退出状态。如果在任何时间点发生错误,QProcess将发出erroroccurrent()信号。您还可以调用error()来查找上一次发生的错误类型,并调用state()来查找当前进程状态。

注意:VxWorks、iOS、tvOS、watchOS或通用Windows平台不支持QProcess。

Communicating via Channels

进程有两个预定义的输出通道:标准输出通道(stdout)提供常规控制台输出,而标准错误通道(stderr)通常提供进程打印的错误。这些通道代表两个独立的数据流。您可以通过调用setReadChannel()在它们之间切换。当数据在当前读取通道上可用时,QProcess发出readyRead()。当新的标准输出数据可用时,它也会发出readyReadStandardOutput(),当新的标准错误数据可用时,它也会发出readyReadStandardError()。您可以通过调用readAllStandardOutput()或readAllStandardError()来显式地从两个通道之一读取所有数据,而不是调用read()、readLine()或getChar()。
频道的术语可能会引起误解。请注意,进程的输出通道对应于QProcess的读通道,而进程的输入通道对应于QProcess的写通道。这是因为我们使用QProcess读取的内容是进程的输出,而我们编写的内容则成为进程的输入。
QProcess可以合并两个输出通道,这样来自运行进程的标准输出和标准错误数据都使用标准输出通道。在启动进程以激活此功能之前,使用MergedChannels调用setProcessChannelMode()。您还可以通过传递ForwardedChannels作为参数,将正在运行的进程的输出转发到调用的主进程。也可以只转发一个输出通道-通常一个通道将使用ForwardedErrorChannel,但ForwardedOutputChannel也存在。请注意,在GUI应用程序中使用通道转发通常是一个坏主意—您应该以图形方式显示错误。
某些过程需要特殊的环境设置才能运行。可以通过调用setProcessEnvironment()为进程设置环境变量。要设置工作目录,请调用setWorkingDirectory()。默认情况下,进程在调用进程的当前工作目录中运行。
属于用QProcess启动的GUI应用程序的窗口的位置和屏幕Z顺序由底层窗口系统控制。对于qt5应用程序,可以使用-qwindowgeometry命令行选项指定定位;X11应用程序通常接受-geometry命令行选项。
注意:在QNX上,由于操作系统的限制,设置工作目录可能会导致除QProcess调用线程之外的所有应用程序线程在生成过程中暂时冻结。

Synchronous Process API

QProcess提供了一组函数,允许在没有事件循环的情况下使用它,方法是挂起调用线程,直到发出某些信号:
waitForStarted()将阻止,直到进程启动。
waitForReadyRead()会阻塞,直到有新数据可以在当前读取通道上读取。
waitForBytesWrited()将阻塞,直到一个有效数据被写入进程。
waitForFinished()将阻止,直到进程完成。
从主线程(调用QApplication::exec()的线程)调用这些函数可能会导致用户界面冻结。
下面的示例运行gzip来压缩字符串“Qt rocks!”,没有事件循环:

 QProcess gzip;gzip.start("gzip", QStringList() << "-c");if (!gzip.waitForStarted())return false;gzip.write("Qt rocks!");gzip.closeWriteChannel();if (!gzip.waitForFinished())return false;QByteArray result = gzip.readAll();

Notes for Windows Users

有些Windows命令(例如dir)不是由单独的应用程序提供的,而是由命令解释器本身提供的。如果您试图使用QProcess直接执行这些命令,它将无法工作。一种可能的解决方案是执行命令解释器本身(cmd.exe在某些Windows系统上),并要求解释器执行所需的命令。
另请参见QBuffer、QFile和QTcpSocket。

QProcess文档相关推荐

  1. linux 基于qt assistant制作软件帮助文档,基于Qt Assistant的软件帮助系统

    Qt Assistant是Qt自带的一款可定制.可重新发行的帮助文件浏览器.Qt Assistant支持HTML文件,用户可以利用其定制自己的功能强大的帮助文档浏览器.关于Qt Assistant定制 ...

  2. qt xml组包_Qt 利用XML文档,写一个程序集合 二

    XML文档的读写 一个根节点,下面每一个子节点代表一个子程序,内容为子程序名字,图标路径,exe路径 /* * 读取XML配置文档 */ static int count_flag = 0; void ...

  3. 实现QT打开Word文档

    通过QT实现点击按钮打开Word文档,需要用到QProcess,在程序中加入#include <QProcess>. 代码: .h文件 #ifndef SIDEBAR_H #define ...

  4. 用DOS命令打开IE浏览器、我的文档等等

    用DOS命令打开IE浏览器 在"start"-运行中直接输入网址就可以了.如输入百度: http://www.baidu.com Command:[ start  http://w ...

  5. DTK壁纸管理器详细文档

    简介 本项目是一个壁纸管理器的Demo,使用了DIconButton,DSpinner,DImageViewer等 DTK组件,可以查看本地系统壁纸和在线的壁纸,还可以可以实现查看壁纸大图,保存图片设 ...

  6. QT/C++标签文档报表工具

    QT/C++标签文档报表工具 一.演示预览 二.使用步骤 1.环境配置 二.核心代码 1.报表程序 2. 数据库程序 三.代码链接 一.演示预览 二.使用步骤 1.环境配置 1.第一次在电脑上需要注册 ...

  7. QT打开Word 文档

    转载:QT如何用QProcess打开一个word文档?_百度知道 (baidu.com) 坑死了,网上好多类似的,但是不说清楚,对新手太不友好了! 需要加上#include <QProcess& ...

  8. 导出swagger2生成的文档

    百度了好多篇用法,没法用.特此记录一下 一.下载项目 下载https://github.com/Swagger2Markup/spring-swagger2markup-demo下的项目,保存,注意文 ...

  9. README 规范和项目文档规范

    1. README 规范 我们直接通过一个 README 模板,来看一下 README 规范中的内容: # 项目名称<!-- 写一段简短的话描述项目 -->## 功能特性<!-- 描 ...

最新文章

  1. 阿里AI攻克心血管识别技术,冠脉中心线提取论文入选国际医学影像会议
  2. c++程序的多文件组织
  3. react 动态修改路由_reactjs – 如何动态添加重定向到反应路由器?
  4. c语言 集中上机题目,C语言集中上机题目.doc
  5. web----epoll实现原理
  6. 贪心应用--汽车加油次数问题
  7. Hive+LDAP+Sentry
  8. 1.22 OSS旧IP下线公告
  9. Android Message和obtainMessage的区别
  10. [转] 客户端的JavaScript脚本中获取服务器端控件的值 及ID
  11. Mac VS code latex pdf 安装教程
  12. python爬公众号文章_python爬取指定微信公众号文章
  13. 【error】error: failed to push some refs to ‘远程仓库地址‘ git报错解决
  14. Linux服务器命令
  15. MovieClip序列帧动画 视频教程
  16. 为什么别人的晋升速度这么快?
  17. [unity]在unity中创建圆锥体
  18. 支持移动触摸设备的简洁js幻灯片插件
  19. CSS学习(三)—— 浮动与定位
  20. 使用PTGui软件将全景图变成鱼眼图

热门文章

  1. 网易云信-短信验证码发送、验证
  2. signature=530d9c5e7e99d796faa35352560aede4,Dealing with Challenging Problems
  3. 试题 算法提高 珠心算测验
  4. TI2000系列JTAG仿真器XDS220U使用注意事项
  5. java/spring/springboot 的一些基础知识点
  6. EtherCAT运动控制卡和LabVIEW构建智能装备(三)
  7. spring+hibernate+jpa+Druid的配置文件,spring整合Druid
  8. java 报文_java模拟报文
  9. 知网研学导入文献题录和引用文献的方法
  10. CXF——搭建CXF实战例子