Qt扫盲-QProcess理论总结
QProcess理论使用总结
- 一、概述
- 二、使用
- 三、通过 Channel 通道通信
- 四、同步进程API
- 五、注意事项
- 1. 平台特性
- 2. 不能实时读取
一、概述
QProcess 其实更多的是与外面进程进行交互的一个工具类,通过这个类来启动外部进程,获取这个进程的标准输出,同时也可以向这个类写入数据,外部进程根据写入的指令执行对应的命令,我们可以也可能获取到输出,但是这种输出是取决于外部的进程。
二、使用
要启动一个进程外部,需要将要运行的程序的名称和命令行参数作为参数传递给start()。就很像命令行里面的执行一样。
多参数可以存放在 QStringList 数组中。
或者,你可以设置这个程序,让它使用setProgram()和setArguments()运行,然后调用start()或open()。
例如,下面的代码片段在X11平台上以 Fusion 样式运行模拟时钟示例,其参数列表中包含" style"和" Fusion "两项:
QObject *parent;...
QString program = "./path/to/Qt/examples/widgets/analogclock";
QStringList arguments;
arguments << "-style" << "fusion";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program, arguments);
然后,QProcess进入启动状态,当外部进程开始时,QProcess进入运行状态,并发出 started() 信号。
QProcess 允许我们将进程视为 序列I/O 设备。因为 QProcess 本身继承至 QIODevice 类,我们可以对进程进行读写,就像使用QTcpSocket 访问网络连接一样。然后,你可以调用write()来写入进程的标准输入,并调用read()、readLine() 和 getChar() 来读取标准输出。因为它继承了QIODevice,所以QProcess 也可以用作 QXmlReader 的输入源,或者用来生成要使用QNetworkAccessManager上传的数据。
当外部进程退出时,QProcess 重新进入NotRunning 状态(初始状态),并发出 finished() 信号。
finished()信号提供了进程的退出代码和退出状态作为参数,你还可以调用exitCode()来获得最后一个已经完成的进程的退出代码,调用exitStatus()来获得它的退出状态。
如果在任何时间点发生错误,QProcess将发出erroroccurs()信号。你还可以调用error()来查找上次发生的错误类型,调用state()来查找当前进程的状态。
- 注意:VxWorks、iOS、tvOS、watchOS或UWP平台不支持QProcess。
三、通过 Channel 通道通信
进程有两个预定义的输出通道:
- 标准输出通道(stdout)提供常规控制台输出
- 标准错误通道(stderr)通常提供进程打印的错误。
这些通道代表两个独立的数据流。你可以通过调用setReadChannel()来切换它们。
当数据在当前读通道上可用时,QProcess发出 readyRead() 【这个是继承至 QIODevice 的功能】。
当有新的标准输出数据时,它还会触发readyReadStandardOutput()
当有新的标准错误数据时,它还会触发readyreadstandardror()。
除了调用read()、readLine()或getChar(),你还可以通过调用 readAllStandardOutput() 或 readallstandderror() 显式地从两个通道中读取所有数据。
这些频道的术语可能会引起误解。
请注意,进程的输出通道对应于QProcess的读通道,而进程的输入通道对应于QProcess的写通道。这是因为我们使用QProcess 读取的内容是过程的输出,而我们写入的内容成为过程的输入。我们读的就是外部进程的输出,我们写的就是外部进程的输入。
QProcess 可以合并两个输出通道,使来自运行过程的标准输出和标准错误数据都使用标准输出通道。在启动进程之前,使用MergedChannels 调用setProcessChannelMode( )来激活此功能。
您还可以选择将ForwardedChannels作为参数,将正在运行的进程的输出转发给调用的主进程。也可以只转发一个输出通道——通常会使用ForwardedErrorChannel,但也存在ForwardedOutputChannel。请注意,在GUI应用程序中使用通道转发通常是一个坏主意——您应该以图形方式显示错误。
某些进程需要特殊的环境设置才能运行。调用setProcessEnvironment()可以设置进程的环境变量。
要设置工作目录,可以调用setWorkingDirectory()。默认情况下,进程运行在调用进程的当前工作目录中。
以QProcess启动的GUI应用程序的窗口位置和层叠顺序由底层窗口系统控制。对于Qt 5应用程序,可以使用
-qwindowgeometry 命令行选项指定位置;X11应用程序通常接受-geometry命令行选项。
注意:在QNX上,由于操作系统的限制,设置工作目录可能会导致除QProcess调用者线程之外的所有应用程序线程在生成过程中暂时冻结。
四、同步进程API
在第三里面提到的一些信号槽都是异步处理,不会说会存在同步的问题,下面的就是一些同步阻塞的一些API,大部分都是继承了 QIODevice 的功能。
QProcess提供了一组函数,通过暂停调用线程直到发出某些信号,允许它在没有事件循环的情况下使用:
- waitForStarted()会阻塞进程直到进程开始
- waitForReadyRead()将阻塞到当前读通道有新数据可读为止。
- waitForBytesWritten()将阻塞,直到有一个有效的数据写入进程。
- waitForFinished()会阻塞,直到进程结束。
从主线程(调用QApplication::exec()的线程) 调用这些函数可能会导致用户界面冻结。 一般来说很大可能必然卡界面
下面的例子运行gzip来压缩字符串"Qt rocks!",没有使用事件循环,也就是信号槽的功能
QProcess gzip;gzip.start("gzip", QStringList() << "-c");if (!gzip.waitForStarted())return false;gzip.write("Qt rocks!");gzip.closeWriteChannel();if (!gzip.waitForFinished())return false;QByteArray result = gzip.readAll();
五、注意事项
1. 平台特性
有些Windows命令(例如dir)不是由单独的应用程序提供的,而是由命令解释器本身提供的。如果试图使用QProcess直接执行这些命令,它将不起作用。
一种可能的解决方案是执行命令解释器本身(在某些Windows系统上是cmd.exe),并要求解释器执行所需的命令。
就需要用 这种,有时候需要加上 ‘\n’ 表示回车
QProcess cmdProcess;
cmdProcess.start("cmd");cmdProcess.write("dir\n");
2. 不能实时读取
很大可能就是 外部进程不是马上输出的,需要把标准的输出给 刷新下去,比如在外部执行一个 py 脚本
for i in range(1,1000):if i % 2:for y in range(1,800000):if y == 999: print("num i = {0}".format(i))
上面我实验的时候本来期望一次一次输出,在QProcess 里也能一次一次获取,但是不行,上面那个会输出完才一起输出
下面这个就可以一次一次获取输出。不设置缓存,全部输出出去。
import sysfor i in range(1,1000):if i % 2:for y in range(1,800000):if y == 999: sys.stdout.write("num i = {0}".format(i))sys.stdout.flush()
相关文章:
Qt扫盲-QProcess理论总结
QProcess理论使用总结一、概述二、使用三、通过 Channel 通道通信四、同步进程API五、注意事项1. 平台特性2. 不能实时读取一、概述 QProcess 其实更多的是与外面进程进行交互的一个工具类,通过这个类来启动外部进程,获取这个进程的标准输出,…...
JAVA进阶 —— Steam流
目录 一、 引言 二、 Stream流概述 三、Stream流的使用步骤 1. 获取Stream流 1.1 单列集合 1.2 双列集合 1.3 数组 1.4 零散数据 2. Stream流的中间方法 3. Stream流的终结方法 四、 练习 1. 数据过滤 2. 数据操作 - 按年龄筛选 3. 数据操作 - 演员信息要求…...
Ubuntu Protobuf 安装(测试有效)
安装流程 下载软件 下载自己要安装的版本:https://github.com/protocolbuffers/protobuf 下载源码编译: 系统环境:Ubuntu16(其它版本亦可),Protobuf-3.6.1 编译源码 cd protobuf# 当使用 git clone 下来的…...
驱动程序开发:FTP服务器和OpenSSH的移植与搭建、以及一些笔记
目录一、FTP服务器移植与搭建1、在ubuntu下安装vsftpd2、在window下安装FileZilla3、移植vsftpd到开发板上4、Filezilla 连接测试5、注意点二、开发板 OpenSSH 移植与使用1、移植 zlib 库2、移植 openssl 库3、移植 openssh 库4、openssh 使用测试三、关于u-boot上的操作及根文…...
优化改进YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模块(超详细)
目录 1、IoU 1.1 什么是IOU 1.2 IOU代码 2、GIOU 2.1 为什么提出GIOU 2.2 GIoU代码 3 DIoU 3.1 为什么提出DIOU 3.2 DIOU代码 4 CIOU 4.1 为什么提出CIOU 4.2 CIOU代码 5 EIOU 5.1 为什么提出EIOU 5.2 EIOU代码 6 Wise-IoU 7 YOLOv5中添加GIoU、DIoU、CIoU、…...
windows电脑pc如何使用svn获取文档和代码
一、安装svn 下载链接 也可通过其他方式下载 二、使用 2.1 随便找一个文件夹 2.2 点击右键,选择SVN Checkout 2.3输入网址 如当你在网页上访问时地址为https://10.197.78.78/!/#aaa/view/head/bbb 在这里不能直接填入,而是 https://10.197.78.78/sv…...
ROS1学习笔记:tf坐标系广播与监听的编程实现(ubuntu20.04)
参考B站古月居ROS入门21讲:tf坐标系广播与监听的编程实现 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录一、创建功能包二、创建代码2.1 以C为例2.1.1 配置代码编译规则2.1.2 编译整个工作空间2.1.2 配置环境变量2.1.4 执行代码2.2 以Python为例2.2.1 配置代码…...
力扣解法汇总1590. 使数组和能被 P 整除
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一个正整数数组 nums,请你移除 最短 子数组(可以为 …...
Spring源码阅读(基础)
第一章:bean的元数据 1.bean的注入方式: 1.1 xml文件 1.2 注解 Component(自己写的类才能在上面加这些注解) 1.3配置类: Configuration 注入第三方数据源之类 1.4 import注解 (引用了Myselector类下…...
服务搭建篇(九) 使用GitLab+Jenkins搭建CI\CD执行环境 (上) 基础环境搭建
1.前言 每当我们程序员开发在本地完成开发之后 , 都要部署到正式环境去使用 , 在一些传统的运维体系中 , 开发与运维都是割裂的 , 开发人员不允许操作正式服务器 , 服务器只能通过运维团队来操作 , 这样可以极大的提高服务器的安全性 , 不经过安全保护的开放服务器 , 对于黑客…...
CDC 长沙站丨云原生技术研讨会:数字兴链,云化未来!
一、活动信息:活动主题:CDC 长沙站丨云原生技术研讨会活动时间:2023 年 3 月 14 日下午 14:30-17:30活动地点:长沙市岳麓区-拓维信息总部 1 楼多功能厅活动参与方式:免门票参与,戳此…...
A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[二](DTransE/PairRE:基于表示学习的知识图谱链接预测算法)
推荐参考文章: A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[一](基于距离的翻译模型:TransE、TransH、TransR、TransH、TransA、RotatE) A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[二](DTransE/PairRE:基于表示学习的知识图谱链接预测算法) A.…...
香港酒店模拟分析项目报告--使用tableau、python、matlab
转载请标记本文出处 软件:tableau、pycharm、关系型数据库:MySQL 数据大量分析考虑电脑性能的情况。 文章目录前言一、爬虫是什么?二、使用tableau数据可视化1.引入数据1.1 制作直方图-各地区酒店数量条形图1.2 各地区酒店均价1.3 价格等级堆…...
第18天-商城业务(商品检索服务,基于Elastic Search完成商品检索)
1.构建商品检索页面 1.1.引入依赖 <!-- thymeleaf模板引擎 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- 热更新 --><…...
5.2 对射式红外传感器旋转编码器计次
对射式红外传感器1.1 接线图VCC GND分别接电源的正负极DO数字输出端,随意选择一个GPIO口1.2 硬件原理当挡光片或者编码盘在对射式红外传感器中间经过时,DO就会输出电平变化信号,电平跳变信号触发STM32 PB14号口中断,在中断函数中执…...
【数据库概论】第九章 关系查询处理和查询优化
第九章 关系查询处理和查询优化 本章主要介绍关系数据库查询管理和查询优化,主要分为代数优化(又称逻辑优化)和物理优化(也称非代数优化)。 9.1 关系型数据库系统的查询处理 查询处理是关系型数据库管理系统执行查询…...
(WIP) my cloud test bed (by quqi99)
作者:张华 发表于:2023-03-10 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 问题 想创建一个local local test bed, 用来方便做各种云实验,如openstack, k8s, ovn, lxd等…...
git | git 2023 详细版
文章目录一、Git命令1.2 设计用户签名1.3 初始化本地库1.4 查看本地库状态1.5 添加至暂存区1.6 从暂存区删除1.7 将暂存区的文件提交到本地库1.8 查看版本信息二、Git分支2.1 查看分支2.2 创建分支2.3 切换分支2.4 合并分支三、GitHub3.1 代码克隆clone3.2 给库取别名3.3 推送本…...
camunda流程引擎基本使用(笔记)
文章目录一、camunda基础1.1 安装与部署流程引擎1.2 流程引擎结构1.3 流程引擎的基本使用1.3.1 创建一个BPMN Diagram1.3.2 实现一个外部工作者1.3.3 部署流程1.3.4 创建一个流程实例并消费1.3.5 向流程中添加用户任务1.3.6 添加网关1.3.7 业务规则二、Java 集成流程引擎2.1 为…...
JS之数据结构与算法
前言数据结构是计算机存储、组织数据的方式,算法是系统描述解决问题的策略。了解基本的数据结构和算法可以提高代码的性能和质量。也是程序猿进阶的一个重要技能。手撸代码实现栈,队列,链表,字典,二叉树,动态规划和贪心算法1.数据结构篇1.1 栈栈的特点:先进后出clas…...
思考的快与慢:模型的“即时回答”与“深思熟虑”
上一篇文章我们学会了如何“使唤”模型:同步、异步、批量、流式,一通操作下来,你已经是调接口的好手了。但很快你可能会发现一个有意思的现象——同样是回答问题,有时候模型快到几乎零秒响应,有时候却要停顿好几秒甚至…...
LSLib:让《神界原罪》和《博德之门3》MOD制作变得高效完整的实用指南
LSLib:让《神界原罪》和《博德之门3》MOD制作变得高效完整的实用指南 【免费下载链接】lslib Tools for manipulating Divinity Original Sin and Baldurs Gate 3 files 项目地址: https://gitcode.com/gh_mirrors/ls/lslib 你是否曾想为《神界原罪》或《博德…...
LangGraph大模型脚手架实战:揭秘6种爆款智能体设计模式,玩转生产级Agent开发!
最近Herness大火,我就在反思,我们在日常进行智能体开发的过程中,是否也在做类似的事,我们用过claude code sdk、codex sdk、copilot cli等通用agent做封装,也用过dify或者coze搭工作流,也用过langchain做过…...
别再只用fitInView了!Qt QGraphicsView自适应显示避坑指南与高级技巧
别再只用fitInView了!Qt QGraphicsView自适应显示避坑指南与高级技巧 在Qt图形界面开发中,QGraphicsView作为展示复杂图形的核心组件,其自适应显示功能经常让开发者又爱又恨。许多开发者第一次遇到需要自适应显示的场景时,都会欣喜…...
门电路的电气特性详解
门电路的电气特性详解 深入理解门电路的电气参数,是设计可靠数字系统的必备知识。 🎯 本章学习要点 理解输入/输出电压阈值参数掌握扇入扇出的概念和计算了解传输延迟对电路的影响理解功耗来源及优化策略 1️⃣ 输入输出特性参数 1.1 电压阈值参数 &a…...
智能水表、血糖仪、工业HMI:STM32L152ZET6的超低功耗MCU应用版图
STM32L152ZET6:带LCD驱动的超低功耗Cortex-M3旗舰MCU 在电池供电的工业仪表、医疗设备和消费电子产品中,微控制器的功耗与集成度往往是决定产品可行性的关键因素。STM32L152ZET6是意法半导体STM32 L1系列中的高端型号,采用2020mm的LQFP-144封…...
群晖相册AI识别解锁指南:让无GPU设备也能享受智能相册功能
群晖相册AI识别解锁指南:让无GPU设备也能享受智能相册功能 【免费下载链接】Synology_Photos_Face_Patch Synology Photos Facial Recognition Patch 项目地址: https://gitcode.com/gh_mirrors/sy/Synology_Photos_Face_Patch 你是否拥有DS918或DS3615xs等群…...
Zotero茉莉花插件:3大核心功能彻底解决中文文献管理难题
Zotero茉莉花插件:3大核心功能彻底解决中文文献管理难题 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 还在为Zotero…...
CANN asc-devkit Maxs API参考
Maxs 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/cann/…...
OpenVSP参数化飞机设计深度解析:从几何建模到气动分析的完整技术栈
OpenVSP参数化飞机设计深度解析:从几何建模到气动分析的完整技术栈 【免费下载链接】OpenVSP A parametric aircraft geometry tool 项目地址: https://gitcode.com/gh_mirrors/ope/OpenVSP OpenVSP是一款由NASA开发的开源参数化飞机几何设计工具,…...
