Qt之Qprocess

Qt之QprocessQProcess 可用于完成外部程序 并与之交互通信 一 启动外部程序的两种方式 1 一体式 voidQProcess start constQString amp program constQString amp arguments OpenModemode ReadWrite 外部程序启动后 将随主程序的退出而退出 2 分离式 voidQProc

QProcess,可用于完成外部程序,并与之交互通信。

一、启动外部程序的两种方式

QProcess::start()与QProcess::execute()都能完成启动外部程序的任务,二者有什么区别呢?区别在于start()是非阻塞的,而execute()是阻塞的。专业点讲,execute()=start()+waitforFinished()。下面是一个按键的槽函数,它响应按键的按下动作:

而开始我用的是volCtrl->start(program,arguments_mute_on),结果调用的程序无效,设置不起作用,经过分析原因是后面还有个close()函数。

这里显然应该是调用阻塞进程的典型场合。

二、启动之前需要做的工作:

启动一个外部程序,需要传递外部程序的路径和执行参数,参数用QStringList来带入。

三、启动状态
  外部程序未启动时,其状态是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读写流类型的网络连接一样来读写一个进程。









八、进程的标准输出:
  stdout:通常用于控制台下输出
  stderr:通常用于进程打印错误
  它们本质上是两个独立的数据流
  可以通过调用setReadChanned()函数设置当前的读通道
  当有可读数据时Qt将发出readyRead()信号
  如果是标准输出和标准错误通道中读取数据,还会发出readyReadStandardOutput()信号
  readAllStandardOutput()函数从标准输出通道中读取数据
  readAllStandardErrot()函数从标准错误通道中读取数据
  在进程启动以前以MergedChannels参数调用setReadChannelMode()函数可以把标准输出通道和标准输出错误通道合并。








转自:https://www.cnblogs.com/wang1994/p/5943154.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217932.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午8:26
下一篇 2026年3月18日 上午8:27


相关推荐

  • Linux mkdir命令

    Linux mkdir命令一 mkdir 命令 mkdir 命令用来创建目录 1 1 语法 mkdir 选项 参数 1 2 选项选项描述 Z 设置安全上下文 当使用 SELinux 时有效 m 目标属性 或 mode 目标属性 建立目录的同时设置目录的权限 p 或 parents 若所要建立目录的上层目录目前尚未建立 则会一并建立上层目录 vers 目标属性 目标属性

    2026年3月19日
    2
  • BootStrap Validator入门

    BootStrap Validator入门目录官网使用效果认识 bootstrapval 初级用法简单使用官网官网 http bootstrapval com 源码下载地址 https github com nghuuphuoc bootstrapval 使用效果认识 bootstrapval 来看 bootstrapval 的描述 T

    2025年10月27日
    5
  • python之判断字符串为数字

    python之判断字符串为数字判断字符串的数据类型 a 123 print a isdigit 是否是数值 b abc print b isalpha 是否是字母 c print c isspace 是否是空格函数说明 isdigit 数字 isalpha 字母 isspace 空格 isdecimal 小数 islower 小写字母

    2026年3月16日
    3
  • python 获取图片分辨率_python读取图片分辨率

    python 获取图片分辨率_python读取图片分辨率使用python获取图片分辨率或大小fromPILimportImagefilename=r’E:\data\yangben\0.jpg’img=Image.open(filename)imgSize=img.size#图片的长和宽print(imgSize)maxSize=max(imgSize)#图片的长边minSize=min(imgSize)#图片的短边print(maxSize,minSize)太慢用清华园python3的话使用

    2025年10月29日
    5
  • RS232标准9针串口引脚定义

    RS232标准9针串口引脚定义无论是 RS 232C RS 422 还是 RS 485 串口接口的外形 尺寸都是相同的 部件间可以通用互换 但其引脚的定义却各不相同 因此要了解串口做线 首先要知道串口各引脚的定义 观察一个标准的串口 会发现串口无论是 9 针的标准串口物理外形 如图 3 4 所示 还是 25 针串口物理外形 如图 3 6 所示 如果横着看 都显示两排引脚 除了两排引脚这一特征之外 还有就是无论是公头 还是母头 两个引

    2026年3月18日
    2
  • 绕过问题也是一种能力–记一次接口的问题「建议收藏」

    绕过问题也是一种能力–记一次接口的问题

    2022年1月19日
    85

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号