QProcess与外部程序的调用
项目做到一定阶段,常常须要在原来的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-不带空格。能够启动
- process->start("F:/AppInst/115/115com/115com.exe");
- //2-带空格,无法启动
- process->start("C:/Program Files/HaoZip/HaoZip.exe");
- //3-带空格,使用带參模式。能够启动
- 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官方自带的样例:
- QObject *parent;
- ...
- QString program = "./path/to/Qt/examples/widgets/analogclock";
- QStringList arguments;
- arguments << "-style" << "fusion";
- QProcess *myProcess = new QProcess(parent);
- 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();
- cmd.waitForFinished();
- QString response = cmd.readAll();
- DebugLog(<<"qtping res:" << response.toStdString());
- if (response.indexOf("ttl") != -)
- {
- //可达
- }
- else
- {
- //不可达
- }
QProcess与外部程序的调用的更多相关文章
- Qt技巧:QProcess与外部程序的调用
项目做到一定阶段,常常须要在原来的project上调用外部程序. Qt为此提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信. 一.启动外部程序的两种方式: (1)一体式 ...
- QProcess与外部程序的调用(可以通过设置管道来交互)
项目做到一定阶段,经常需要在原来的工程上调用外部程序.Qt为此提供了QProcess类,QProcess可用于完成启动外部程序,并与之交互通信. 一.启动外部程序的两种方式:(1)一体式:void Q ...
- Qt之启动外部程序(调用cmd.exe ping putty winscp 管道等等,比较牛叉)
http://blog.csdn.net/u011012932/article/details/50478833
- 使用JDBC调用数据库的存储过程
本篇讲述如何使用JDBC来调用MySQL数据库中的存储过程.建议在学习如何使用JDBC调用存储过程前,请先了解如何在数据库中使用存储过程. 存储过程是指在数据库系统中,一组为了完成特定功能的SQL语句 ...
- 深入了解以太坊虚拟机第4部分——ABI编码外部方法调用的方式
在本系列的上一篇文章中我们看到了Solidity是如何在EVM存储器中表示复杂数据结构的.但是如果无法交互,数据就是没有意义的.智能合约就是数据和外界的中间体. 在这篇文章中我们将会看到Solidit ...
- Python Module_subprocess_调用 Powershell
目录 目录 前言 Powershell call Python Python call Powershell Powershell发送邮件 最后 前言 使用Python内建的subprocess模块, ...
- C# 调用APlayer教程
APlayer介绍 引擎介绍: APlayer 媒体播放引擎是迅雷公司从 年开始开发的通用音视频媒体文件播放内核. 迅雷看看播放器和迅雷影音就是使用 APlayer 作为播放内核,目前迅雷看看播放器在 ...
- 死磕以太坊源码分析之EVM如何调用ABI编码的外部方法
死磕以太坊源码分析之EVM如何调用ABI编码的外部方法 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家 ...
- qt 总结
Qt中的每个类,都有一个对应的同名头文件,其中包含其类定义.例如要使用QApplication类,则需要在程序中添加" #include <QApplication>" ...
随机推荐
- kubernetes系列08—service资源详解
本文收录在容器技术学习系列文章总目录 1.认识service 1.1 为什么要使用service Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结 ...
- 校园生活app结对开发第一天
今天刚开始开发,要安装android studio及熟悉软件操作
- webservice创建、部署和调用
webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互. 下面通过一个简单的例子来创建一个webservice,用的是vs2010开发工具 首先创建一个web应用程序 接着我们添 ...
- Web后端 JAVAWeb面试考查知识点
面试知识点:1:简单讲一下Java的跨平台原理答:由于非跨平台的情况下,对于不同的操作系统,那么就需要开发几套不同程序代码.为了解决这个问题,java通过不同系统,不同版本,不同位数的JVM来屏蔽不同 ...
- Spring boot项目maven的profile多环境配置不自动替换变量的问题解决
Spring boot项目maven的profile多环境配置不自动替换变量的问题解决 在网上找了好久,配置都很简单,可是我的程序就是不能自动替换变量,最终单独测试,发现原来是引用spring b ...
- Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理
本文是接着上篇博客写的:Spring boot 入门(三):SpringBoot 集成结合 AdminLTE(Freemarker),利用 generate 自动生成代码,利用 DataTable 和 ...
- 【English】十、"谓语的地方"看到有两个动词:I go say hello.、非谓语形式
一.I go say hello. 这是一种偏口语的说法.一个句子中不能同时有两个谓语. 标准的用法有: I go and say hello. and 连接这两个动词,表示并列等关系.go and ...
- 数据文件实时同步(rsync + sersync2)
因近期项目需求,需要同步云端服务器的数据给**方做大数据分析. 思路: 起初只要数据同步,准备开放数据采集接口.但实时性较差,会有延迟. 故而寻觅各种解决方案,最终确定使用 rsync 进行文件同步, ...
- nginx预防常见攻击
目录 nginx防止DDOS攻击 概述 攻击手段 配置 限制请求率 限制连接的数量 关闭慢连接 设置 IP 黑名单 设置IP白名单 小站点解决方案 nginx防止CC攻击 概述 主动抑制方法 应用举例 ...
- Django-1- urls的路由配置, 命名, 重定向, path及re_path
1-项目目录下配置(path方法) 这里的访问路径可以是127.0.0.1:8000/index/ 2-APP目录下配置(path方法) 这里的访问路径可以是127.0.0.1:8000/t ...