项目做到一定阶段,常常须要在原来的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())中调用这些函数,可能会造成当前用户界面不响应。

原文:https://www.cnblogs.com/mengfanrong/p/5341512.html

放一个ping IP地址是否可达的例子:

 QString cmdstr = QString("ping -c 3 %1").arg(QString::fromStdString("127.0.0.1"));QProcess cmd;cmd.start(cmdstr);cmd.waitForReadyRead(1000);cmd.waitForFinished(1000);QString response = cmd.readAll();DebugLog(<<"qtping res:" << response.toStdString());if (response.indexOf("ttl") != -1){//可达
       }else{//不可达}

转载于:https://www.cnblogs.com/nanqiang/p/10694640.html

QProcess与外部程序的调用相关推荐

  1. qprocess回调_Qt模块化笔记之core——QProcess控制外部程序

    QProcess是一个为进程间通信创建的类.在linux相关系统中,可以很方便地用它调用执行命令. 它继承自QIODevice.可以想像,它对其它进程的操作方式,就像读写一个文件一样方便. 下面浏览它 ...

  2. QProcess开启外部程序,实时获取该程序的标准输出

    本文参考自QProcess的官方文档的Detailed Description. 当外部程序有新的标准输出数据可用时,QProcess会发出readyReadStandardOutput()信号,接收 ...

  3. QProcess调用外部程序

    QT实战教程: QT初步之计时器 QT信号与槽 QT多线程实战 QT文件读写 文章目录 调用系统指令 系统指令返回值 源码地址: QT调用外部程序 调用系统指令 针对类似复制.移动等功能,显然操作系统 ...

  4. qt QProcess

    qt QProcess QProcess常用三个函数: QProcess::execute(): 以阻塞方式打开外部程序,只有当外部程序执行完后才继续往后执行现程序.其中,外部程序的标准输出.标准错误 ...

  5. Qt通过QProcess启动进程并传递命令行参数

    目录 QProcess 启动外部程序的两种方式 依赖式 分离式: 启动进程前的预处理 设置启动路径 设置启动命令参数 启动的状态 更多说明 Public Functions Signals 设计一个拉 ...

  6. QT 关于QProcess的一些总结

    QProcess 常被用来启动外部程序,并且可以与之进行通讯.本文总结了开发过程中,QProcess的常用操作,部分内容借鉴网上. QProcess启动外部程序,并获取其输出信息 首先新建一个外部程序 ...

  7. Python Module_subprocess_调用 Powershell

    目录 目录 前言 Powershell call Python Python call Powershell Powershell发送邮件 最后 前言 使用Python内建的subprocess模块, ...

  8. 深入了解以太坊虚拟机第4部分——ABI编码外部方法调用的方式

    本文由币乎社区(bihu.com)内容支持计划赞助. 在本系列的上一篇文章中我们看到了Solidity是如何在EVM存储器中表示复杂数据结构的.但是如果无法交互,数据就是没有意义的.智能合约就是数据和 ...

  9. C# 调用APlayer教程

    C# 调用APlayer教程 APlayer介绍 引擎介绍: APlayer 媒体播放引擎是迅雷公司从 2009 年开始开发的通用音视频媒体文件播放内核. 迅雷看看播放器和迅雷影音就是使用 APlay ...

最新文章

  1. 优秀!这些高校诞生一批 “80后”总裁!Top3均来自人工智的黄埔军校!
  2. django 学习笔记(一)
  3. MySQL的又一神器-锁,MySQL面试必备
  4. C/C++语法知识:typedef struct 用法详解
  5. mybatis工作原理_万字好文!MyBatis 的工作原理,你了解过吗?
  6. windows ce6.0系统 支持双网卡吗_MacBook双系统不求人,自己来
  7. 吴恩达神经网络和深度学习-学习笔记-32-卷积神经网络示例
  8. java.sql 拒绝连接_java.sql.SQLException: ORA-01017: 用户名/口令无效; 登录被拒绝
  9. JavaScript:自封装函数利用内置Date对象输出格式化“YYYY-MM-dd hh:mm:ss”时间
  10. 在Centos7上配置docker运行DotNetCore项目
  11. data.getData()返回的Uri
  12. java编程软件安装
  13. thinkpad e480安装win7
  14. 模仿apple中国大陆官方
  15. vue禁用浏览器前进后退
  16. WIFI、路由器、猫、AP管理
  17. 高可靠性技术之RRPP和VRRP
  18. BGA封装的优缺点解析
  19. html显示fps,Three.js - 使用stats.js库显示帧数(以及画面渲染时间)
  20. 开源库UniTask笔记

热门文章

  1. 互联网大厂高薪惯坏了年轻人?
  2. Armbian 20.10 Buster使用rtl8188eu网卡
  3. 是否应该回馈一下CSDN?
  4. 复合型机器狗病毒的***(lssass.exe)
  5. 诸葛神推细则及其预测方法
  6. php nusoap client,PHP的soap 之 nusoap 的使用
  7. 第一次被裁,用 10 天时间争取到了 n + 1 赔偿!
  8. Linux CPU 100%问题 | 理解 CPU负载和 CPU使用率
  9. 3Dmax制作3D全息投影视频(输出预览视频的快捷键是Shift V)
  10. 还在为图像训练数据少发愁吗?那是因为你还不会这几招