当前位置: 首页 > news >正文

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 其实更多的是与外面进程进行交互的一个工具类&#xff0c;通过这个类来启动外部进程&#xff0c;获取这个进程的标准输出&#xff0c…...

JAVA进阶 —— Steam流

目录 一、 引言 二、 Stream流概述 三、Stream流的使用步骤 1. 获取Stream流 1.1 单列集合 1.2 双列集合 1.3 数组 1.4 零散数据 2. Stream流的中间方法 3. Stream流的终结方法 四、 练习 1. 数据过滤 2. 数据操作 - 按年龄筛选 3. 数据操作 - 演员信息要求…...

Ubuntu Protobuf 安装(测试有效)

安装流程 下载软件 下载自己要安装的版本&#xff1a;https://github.com/protocolbuffers/protobuf 下载源码编译&#xff1a; 系统环境&#xff1a;Ubuntu16&#xff08;其它版本亦可&#xff09;&#xff0c;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 点击右键&#xff0c;选择SVN Checkout 2.3输入网址 如当你在网页上访问时地址为https://10.197.78.78/!/#aaa/view/head/bbb 在这里不能直接填入&#xff0c;而是 https://10.197.78.78/sv…...

ROS1学习笔记:tf坐标系广播与监听的编程实现(ubuntu20.04)

参考B站古月居ROS入门21讲&#xff1a;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 整除

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你一个正整数数组 nums&#xff0c;请你移除 最短 子数组&#xff08;可以为 …...

Spring源码阅读(基础)

第一章&#xff1a;bean的元数据 1.bean的注入方式&#xff1a; 1.1 xml文件 1.2 注解 Component&#xff08;自己写的类才能在上面加这些注解&#xff09; 1.3配置类&#xff1a; Configuration 注入第三方数据源之类 1.4 import注解 &#xff08;引用了Myselector类下…...

服务搭建篇(九) 使用GitLab+Jenkins搭建CI\CD执行环境 (上) 基础环境搭建

1.前言 每当我们程序员开发在本地完成开发之后 , 都要部署到正式环境去使用 , 在一些传统的运维体系中 , 开发与运维都是割裂的 , 开发人员不允许操作正式服务器 , 服务器只能通过运维团队来操作 , 这样可以极大的提高服务器的安全性 , 不经过安全保护的开放服务器 , 对于黑客…...

CDC 长沙站丨云原生技术研讨会:数字兴链,云化未来!

一、活动信息&#xff1a;活动主题&#xff1a;CDC 长沙站丨云原生技术研讨会活动时间&#xff1a;2023 年 3 月 14 日下午 14&#xff1a;30-17&#xff1a;30活动地点&#xff1a;长沙市岳麓区-拓维信息总部 1 楼多功能厅活动参与方式&#xff1a;免门票参与&#xff0c;戳此…...

A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[二](DTransE/PairRE:基于表示学习的知识图谱链接预测算法)

推荐参考文章: A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[一](基于距离的翻译模型:TransE、TransH、TransR、TransH、TransA、RotatE) A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[二](DTransE/PairRE:基于表示学习的知识图谱链接预测算法) A.…...

香港酒店模拟分析项目报告--使用tableau、python、matlab

转载请标记本文出处 软件&#xff1a;tableau、pycharm、关系型数据库&#xff1a;MySQL 数据大量分析考虑电脑性能的情况。 文章目录前言一、爬虫是什么&#xff1f;二、使用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数字输出端&#xff0c;随意选择一个GPIO口1.2 硬件原理当挡光片或者编码盘在对射式红外传感器中间经过时&#xff0c;DO就会输出电平变化信号&#xff0c;电平跳变信号触发STM32 PB14号口中断&#xff0c;在中断函数中执…...

【数据库概论】第九章 关系查询处理和查询优化

第九章 关系查询处理和查询优化 本章主要介绍关系数据库查询管理和查询优化&#xff0c;主要分为代数优化&#xff08;又称逻辑优化&#xff09;和物理优化&#xff08;也称非代数优化&#xff09;。 9.1 关系型数据库系统的查询处理 查询处理是关系型数据库管理系统执行查询…...

(WIP) my cloud test bed (by quqi99)

作者&#xff1a;张华 发表于&#xff1a;2023-03-10 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 问题 想创建一个local local test bed, 用来方便做各种云实验&#xff0c;如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 栈栈的特点&#xff1a;先进后出clas…...

CnOpenData·A股上市企业数字化转型指数数据

一、数据简介 企业数字化转型是近年来中国社会各界重点关注的领域&#xff0c;但基础数据的不完善在很大程度上制约了相关科学研究的开展。构建合理、科学的数字化转型指标体系有利于学者定量地研究企业数字化的相关问题&#xff0c;也有利于衡量企业的数字化水平。广东金融学院…...

VMware16pro虚拟机安装全过程

很多时候需要用到Linux系统&#xff0c;简单的一种方式可以是&#xff1a;Windows系统运行Linux&#xff08;Windows Subsystem for Linux&#xff09;不过有些时候还是需要虚拟机来运行Linux&#xff0c;也更方便点&#xff0c;比如在做嵌入式系统的烧录等操作都需要Linux环境…...

阿里云第六代云服务器最新价格表(计算型c6、通用型g6和内存型r6)

目前阿里云第六代云服务器有计算型c6、通用型g6和内存型r6实例。计算型c6实例有2核4G、4核8G、8核16G配置可选&#xff0c;主要适用于网站应用、批量计算、视频编码等场景。通用型g6实例有2核8G、4核16G、8核32G配置可选&#xff0c;适用于各种类型的企业级应用&#xff0c;网站…...

微小目标识别研究(2)——基于K近邻的白酒杂质检测算法实现

文章目录实现思路配置opencv位置剪裁实现代码自适应中值滤波实现代码动态范围增强实现代码形态学处理实现代码图片预处理效果计算帧差连续帧帧差法原理和实现代码实现代码K近邻实现基本介绍实现代码这部分是手动实现的&#xff0c;并没有直接调用相关的库完整的代码——调用ope…...

2022-06-14至2022-08-11 关于复现MKP算法的总结与反思

Prerequisite 自2022年6月14日至2022年8月11日的时间内&#xff0c;我致力于完成A Hybrid Approach for the 0–1 Multidimensional Knapsack problem 论文的复现工作&#xff0c;此次是我第一次进行组合优化方向的学习工作&#xff0c;下面介绍该工作内容发展过程以及该工作结…...

IBMMQ教程二(window版安装)

下载下载地址&#xff1a;https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/我这里选择的是9.1.0.0版本安装将下载完成的压缩包解压双击Setup.exe直接运行点击软件需求查看系统配置是否满足&#xff0c;右边绿色的对号说明满足需求&#xff0c…...

Java | HashSet 语法

HashSet 基于 HashMap 来实现的&#xff0c;是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的&#xff0c;即不会记录插入的顺序。 HashSet 不是线程安全的&#xff0c; 如果多个线程尝试同时修改 HashSet&#xff0c;则最终结果是不确定的。 您必须…...

js学习4(运算符)

### 1.算数运算符&#xff1a; 、-、*、\、%&#xff08;取余&#xff09;、**&#xff08;幂方&#xff09; ## 优先级 同数学课程&#xff0c;可以加括号 ### 2.自增和自减 、--&#xff08;即数值变量加一或减一&#xff09; ### 3.赋值运算符 、、-、*、/、... ### 4.比较运…...

2月更新 | Visual Studio Code Python

我们很高兴地宣布&#xff0c;2023年2月版 Visual Studio Code Python 和 Jupyter 扩展现已推出&#xff01;此版本包括以下改进&#xff1a;从激活的终端启动 VS Code 时的自动选择环境 使用命令 Python: Create Environmen 时可选择需求文件或可选依赖项 预发布&#xff1a;改…...

C++回顾(十八)—— 文件操作

18.1 I/O流概念和流类库结构 1 概念 程序的输入指的是从输入文件将数据传送给程序&#xff0c;程序的输出指的是从程序将数据传送给输出文件。 C输入输出包含以下三个方面的内容&#xff1a; &#xff08;1&#xff09;对系统指定的标准设备的输入和输出。即从键盘输入数据&am…...

网站建设中可能出现的问题/今日国内新闻最新消息10条新闻

江西理工大学理学院江西理工大学理学院第四节线性方程理论、二阶常系数齐次线性方程一、概念的引入例:设有一弹簧下挂一重物,如果使物体具有一个初始速度v0 ≠ 0,物体便离开平衡位置,并在平衡位置附近作上下振动.试确定物体的振动规律 x x(t).解 受力分析1. 恢复力 f ?cx; o…...

做网站需要ps吗/软件开发培训机构

为什么80%的码农都做不了架构师&#xff1f;>>> 作者: 殷坤 来源: InfoQ 测试是为了保证软件的质量&#xff0c;敏捷测试关键是保证可以持续、及时的对软件质量情况进行全面的反馈。由于在敏捷开发过程中每个迭代都会增加功能、修复缺陷或重构代码&#xff0c;所…...

比较好的家装设计网站/做推广哪个平台效果好

大二暑假第一次接触到Java Web项目。由于是第一次学&#xff0c;所以我一股脑把韩顺平老师的servlet视频教程全看完了。然后开始写网站。对于框架&#xff0c;我一直认为是先摸清底层的东西再用框架会比较好&#xff0c;于是这一次便没有用框架&#xff0c;纯servlet写。 然后…...

我要自学网免费视频教程/seo网站关键词优化费用

iOS使用宏定义函数和代码块 今天在开发过程中碰到一个问题&#xff1a;就是父类中要向外发送通知&#xff0c;然后子类中或者其他类中来接收它。当然一般是把它写到类方法中去&#xff0c;但是有个问题&#xff0c;就是如果调用的类不是它的子类&#xff0c;就不能直接调用&…...

bitcoind 做交易网站/江苏企业seo推广

文章目录展开补丁包查询当前状态检查关闭数据库&#xff0c;然后打补丁。启动数据库后检查没有发现刚才打的补丁&#xff01;执行datapatch再检查文章下方是我的微信&#xff0c;欢迎加我。&#x1f447;展开补丁包 inflating: 31281355/README.html inflating: PatchSearch…...

湘潭seo优化价格/seo搜索引擎优化哪家好

好的博客&#xff1a; http://blog.csdn.net/wdong_love_cl/article/details/52084720转载于:https://www.cnblogs.com/webor2006/p/7041630.html...