转自: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的一些用法相关推荐

  1. QProcess的正确用法

    在进行编程过程中,经常用到在程序当中调用其它的程序,这就需要用到进程调用,在QT中就用到了QProcess的进行进程调用,其有QT自身的特点,用起来非常方便,与C++本身的接口不一样,其流程特点如下: ...

  2. QProcess用法

    QProcess类用于启动外部程序并与之通信. 启动一个新进程的方式:把待启动的程序名称和启动参数传递给start()函数即可. 例如: QProcess *parent: QString progr ...

  3. QCopChannel的用法

    QT提供了很多的进程间通讯的方法,例如共享内存,QProcess等等.但有一种方法是嵌入式端所独有的,那就是Qt Communications Protocol(QCOP)QT通讯协议,这种方法只能用 ...

  4. window cmd 用法简介

    net share d:\web=e:\web /grant:zk0898,change 控制面版:运行>>>>>>>>>>>:con ...

  5. qprocess回调_Qt图形编程基础之:Qt/Embedded开发入门-嵌入式系统-与非网

    12.2.1  Qt/Embedded介绍 1.架构 Qt/Embedded以原始Qt为基础,并做了许多出色的调整以适用于嵌入式环境.Qt/Embedded通过Qt API与Linux I/O设施直接 ...

  6. 关于QProcess的使用问题解释

    QProcess 有两种用法模式: 一个是调用 start() 或 execute():此时被调用函数的标准输入.标准输出.标准出错 都已经被重定向到QProcess创建的相应的管道中.在这种情况下, ...

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

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

  8. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  9. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

最新文章

  1. npm 安装包失败 --- 清除npm缓存
  2. CTF-IDA的常用操作(初学者)
  3. 8个主流且实用的Python开发工具推荐
  4. JavaScript权威指南--多媒体和图形编程
  5. 可以直接在C++里面写类似RSL的shader了
  6. 图文列表+富文本解析+折线图示例小程序模板
  7. IEWebBrowser
  8. python 实时取色器3.0(升级版)【内附源码】
  9. Image Caption 常用评价指标
  10. 天涯海客邮件搜索群发大师 使用说明
  11. cgcs2000大地坐标系地图_我国大地坐标系_地图与地图制图
  12. 使用base64格式字符串播放音频
  13. CDR VBA X6中Exportbitmap函数的用法(导出图片)
  14. 卡尔曼滤波(Kalman filter)算法
  15. 华为实习笔试2020.4.15
  16. 营业执照识别/营业执照OCR识别API
  17. 直播网站程序源码,搜索框实现快速搜索功能
  18. mysql select符合查询_mysql学习-select查询,子查询,联接查询,union,intersect,except联合...
  19. android屏幕广播软件,广西视听app下载 广西视听(广西广播电视台手机客户端) for Android v2.2.0 安卓手机版 下载-脚本之家...
  20. InverseCSG: Automatic Conversion of 3D Models to CSG Trees

热门文章

  1. 计算机网络——组播地址(多播地址、D类地址)详解——不断完善更新中
  2. opencv眼动识别(1_眼睛分割)
  3. pandas 数据分析 相关性_pandas数据分析
  4. 编程常用英语词汇(一)
  5. 俄罗斯版谷歌Yandex 遭Mēris僵尸网络大规模攻击
  6. U盘安装CentOS7出现问题的解决方案
  7. linux内核版本5.3,Linux 5.3-rc1内核kernel-ppa已经推出,用户可用deb安装5.3内核版本...
  8. 航顺主流替代型HK32F103系列
  9. Go os.OpenFile()bufio.NewWriter()文件创建并使用带缓冲区写文件
  10. 关于下载频道的一系列迷雾