QProcess的一些用法
转自:https://www.cnblogs.com/wang1994/p/5943154.html
初学QT开发 ,偶然读到,很有帮助。(readyRead()信号可以用于进程间通信?https://forum.qt.io/topic/77772/%E7%BA%BF%E7%A8%8B-readyread-%E4%BF%A1%E5%8F%B7-%E6%A7%BD)
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)
外部程序启动后,当主程序退出时并不退出,而是继续运行。
二、启动之前需要做的工作:
启动一个外部程序,需要传递外部程序的路径和执行参数,参数用QStringList来带入。
1)设置路径
void QProcess::setProgram(const QString & program)
2)设置参数【可选】
void QProcess::setArguments(const QStringList & arguments)
3)启动
选择启动函数(两种方式)
三、启动状态
外部程序未启动时,其状态是NotRunning;
当启动时,其状态转变为Starting,正在启动,但此时还未调用起来;
启动之后,继续变为Running,同时发射出started()信号,此时,可以对QProcess进行读写操作了;
当退出时,其状态改为NotRunning,并发射出finished()信号。finished()信号会携带退出码和退出状态,可以分别通过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()来设置工作目录,默认的工作路径是当前调用程序的工作路径。
六、同步API
QProcess提供了一系列的函数以提到事件循环来完成同步操作:
1)waitForStarted()//阻塞,直到外部程序启动
2)waitForReadyRead()//阻塞,直到输出通道中的新数据可读
3) waitForBytesWritten()//阻塞,直到输入通道中的数据被写入
4) waitForFinished() //阻塞,直到外部程序结束
如果在主线程中调用这些函数,可能会造成当前用户界面不响应。
七、QProcess进程类
Qt提供了一个QProcess类用于启动外部程序并与之通信,启动一个新的进程的操作非常简单,只需要将待启动的程序名称和启动参数传递给start()函数即可。
例:
Qobject *parent;
QString program = "tar";
QStringList arguments;
arguments<<"czvf"<<"backup.tar.gz"<<"/home";
QProcess *myProcess= new QProcess(parent);
QProcess->start(program,arguments);
当调用start()函数后,myProcess进程立即进入启动状态,但tar程序尚未被调用,不能读入标准输入输出设备。当进程完成启动后就进入“运行状态”并向外发送出
started()信号,在输入输出方面,QProcess将一个进程看做一个类型的I/O设备,可以像使用QTcpSocket读写流类型的网络连接一样来读写一个进程。
可以通过QIODevice::write()函数向所启动的进程的标准输入写数据,也可以通过QIODeivic::read()、QIODevice::readLine()、QIODevice::getChar()函数从这个进程的标准输出读数据。此外由于QProcess是从QIODevice类继承而来的。
Qt定义了如下的进程错误代码:
错误常量 值 描述
QProcess::FailedToStart 0 进程启动失败
QProcess::Crashed 1 进程成功后崩溃
QProcess::Timedout 2 最后一次调用waitFor...()函数超时。此时QProcess状态不变,并可以再次调用waitFor...()类型的函数
QProcess::WriteError 3 向进程中写入数据时出错。如进程尚未启动,或者输入通道被关闭时。
QProcee::ReadError 4 从进程中读取数据时出错。如进程尚未启动时
QProcess::UnknownError 5 未知错误。这也是error()函数返回的默认值。
八、进程的标准输出:
stdout:通常用于控制台下输出
stderr:通常用于进程打印错误
它们本质上是两个独立的数据流
可以通过调用setReadChanned()函数设置当前的读通道
当有可读数据时Qt将发出readyRead()信号
如果是标准输出和标准错误通道中读取数据,还会发出readyReadStandardOutput()信号
readAllStandardOutput()函数从标准输出通道中读取数据
readAllStandardErrot()函数从标准错误通道中读取数据
在进程启动以前以MergedChannels参数调用setReadChannelMode()函数可以把标准输出通道和标准输出错误通道合并。
The future's not set,there is no fate but what we make for ourselves.
QProcess的一些用法相关推荐
- QProcess的正确用法
在进行编程过程中,经常用到在程序当中调用其它的程序,这就需要用到进程调用,在QT中就用到了QProcess的进行进程调用,其有QT自身的特点,用起来非常方便,与C++本身的接口不一样,其流程特点如下: ...
- QProcess用法
QProcess类用于启动外部程序并与之通信. 启动一个新进程的方式:把待启动的程序名称和启动参数传递给start()函数即可. 例如: QProcess *parent: QString progr ...
- QCopChannel的用法
QT提供了很多的进程间通讯的方法,例如共享内存,QProcess等等.但有一种方法是嵌入式端所独有的,那就是Qt Communications Protocol(QCOP)QT通讯协议,这种方法只能用 ...
- window cmd 用法简介
net share d:\web=e:\web /grant:zk0898,change 控制面版:运行>>>>>>>>>>>:con ...
- qprocess回调_Qt图形编程基础之:Qt/Embedded开发入门-嵌入式系统-与非网
12.2.1 Qt/Embedded介绍 1.架构 Qt/Embedded以原始Qt为基础,并做了许多出色的调整以适用于嵌入式环境.Qt/Embedded通过Qt API与Linux I/O设施直接 ...
- 关于QProcess的使用问题解释
QProcess 有两种用法模式: 一个是调用 start() 或 execute():此时被调用函数的标准输入.标准输出.标准出错 都已经被重定向到QProcess创建的相应的管道中.在这种情况下, ...
- qprocess回调_Qt模块化笔记之core——QProcess控制外部程序
QProcess是一个为进程间通信创建的类.在linux相关系统中,可以很方便地用它调用执行命令. 它继承自QIODevice.可以想像,它对其它进程的操作方式,就像读写一个文件一样方便. 下面浏览它 ...
- c语言中external,static关键字用法
static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...
- Pandas_transform的用法
先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...
最新文章
- npm 安装包失败 --- 清除npm缓存
- CTF-IDA的常用操作(初学者)
- 8个主流且实用的Python开发工具推荐
- JavaScript权威指南--多媒体和图形编程
- 可以直接在C++里面写类似RSL的shader了
- 图文列表+富文本解析+折线图示例小程序模板
- IEWebBrowser
- python 实时取色器3.0(升级版)【内附源码】
- Image Caption 常用评价指标
- 天涯海客邮件搜索群发大师 使用说明
- cgcs2000大地坐标系地图_我国大地坐标系_地图与地图制图
- 使用base64格式字符串播放音频
- CDR VBA X6中Exportbitmap函数的用法(导出图片)
- 卡尔曼滤波(Kalman filter)算法
- 华为实习笔试2020.4.15
- 营业执照识别/营业执照OCR识别API
- 直播网站程序源码,搜索框实现快速搜索功能
- mysql select符合查询_mysql学习-select查询,子查询,联接查询,union,intersect,except联合...
- android屏幕广播软件,广西视听app下载 广西视听(广西广播电视台手机客户端) for Android v2.2.0 安卓手机版 下载-脚本之家...
- InverseCSG: Automatic Conversion of 3D Models to CSG Trees
热门文章
- 计算机网络——组播地址(多播地址、D类地址)详解——不断完善更新中
- opencv眼动识别(1_眼睛分割)
- pandas 数据分析 相关性_pandas数据分析
- 编程常用英语词汇(一)
- 俄罗斯版谷歌Yandex 遭Mēris僵尸网络大规模攻击
- U盘安装CentOS7出现问题的解决方案
- linux内核版本5.3,Linux 5.3-rc1内核kernel-ppa已经推出,用户可用deb安装5.3内核版本...
- 航顺主流替代型HK32F103系列
- Go os.OpenFile()bufio.NewWriter()文件创建并使用带缓冲区写文件
- 关于下载频道的一系列迷雾