QT笔记——QProcess学习

我们常常想通过某一个类,来启动一个外部进程

本文将讲解如何通过QProcess来进行启动外部进程

一:了解QProcess

QProcess是Qt框架提供的一个类,用于在应用程序中执行外部进程。它提供了一系列函数来启动、控制和与外部进程进行交互

1.启动进程的方式:
(1.1)分离式:外部程序启动程序后,主程序退出时,被调用的进程继续执行,不退出
请添加图片描述

[static] bool QProcess::startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory = QString(), qint64 *pid = nullptr)

(1.2)一体式:当主程序退出时,被主程序调用起来的进程也退出

start还有其他的重载的函数,下面是其中一个
请添加图片描述

void QProcess::start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite)

2:常用的阻塞函数

// 主进程阻塞,直到外部程序启动完毕,
waitForStarted()// 主进程阻塞,直到外部程序执行完毕
waitForFinished() 

3:被调用进程接受数据


4:主进程接受被调用进程的数据
(4.1)使用QFile输出内容被 主进程捕获

QFile file;
file.open(1, QFile::WriteOnly);
file.write("finished");
file.close();

(4.2)使用输出流 被 主进程捕获

 cout << "it's message" << endl;

5:常用的信号
请添加图片描述

//启动完毕
connect(process, &QProcess::started, this, [=]()
{});//捕获到消息时
connect(process, &QProcess::readyReadStandardOutput, this, [=]()
{});//完成
connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [=](int exitCode, QProcess::ExitStatus exitStatus)
{});//状态改变
connect(process, &QProcess::stateChanged, this, [=](QProcess::ProcessState state)
{});

二:使用QPrecess

1:startDetached 启动进程

1:使用了startDetached来启动进程,信号都是无效的,接受不到任何消息
2:当主进程关闭时,被调用的QTcpClientTest.exe 是不会退出的
3:主进程发送的参数,被调用的QTcpClientTest.exe 依然可以接受

void QTcpSeverTest::on_btn1_clicked()
{QProcess* process = new QProcess(this);QString str = QApplication::applicationDirPath() + "/QTcpClientTest.exe";QStringList list;list.append("123");list.append("456");//分离式 启动外部进程process->startDetached(str, list);//无效connect(process, &QProcess::started, this, [=](){qDebug() << "started";});//无效connect(process, &QProcess::readyReadStandardOutput, this, [=](){QString qstr(process->readAllStandardOutput());qDebug() << "startDetached:" << qstr;});connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [=](int exitCode, QProcess::ExitStatus exitStatus){QString result = process->readAll();qDebug() << "result:" << result;});//无效connect(process, &QProcess::stateChanged, this, [=](QProcess::ProcessState state){qDebug() << "show state:";switch (state){case QProcess::NotRunning:qDebug() << "Not Running";break;case QProcess::Starting:qDebug() << "Starting";break;case QProcess::Running:qDebug() << "Running";break;default:qDebug() << "otherState";break;}});}

2:start启动进程

1:使用了startDetached来启动进程,信号都是可以接受的
2:当主进程关闭时,被调用的QTcpClientTest.exe 是随着主进程一起退出
3:主进程发送的参数,被调用的QTcpClientTest.exe 可以接受参数

	QProcess* process = new QProcess(this);QString str = QApplication::applicationDirPath() + "/QTcpClientTest.exe";QStringList list;list.append("bbbbb");list.append("aaaaa");//启动完毕connect(process, &QProcess::started, this, [=](){qDebug() << "started:" ;});//捕获到消息时connect(process, &QProcess::readyReadStandardOutput, this, [=](){QString qstr(process->readAllStandardOutput());qDebug() << "readyReadStandardOutput:" << qstr;});//完成connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [=](int exitCode, QProcess::ExitStatus exitStatus){if (exitStatus == QProcess::NormalExit) {qDebug() << "Process finished with exit code:" << exitCode;}else {qDebug() << "Process crashed!";}});//状态改变connect(process, &QProcess::stateChanged, this, [=](QProcess::ProcessState state){qDebug() << "show state:";switch (state){case QProcess::NotRunning:qDebug() << "Not Running";break;case QProcess::Starting:qDebug() << "Starting";break;case QProcess::Running:qDebug() << "Running";break;default:qDebug() << "otherState";break;}});//一体式  启动外部进程process->start(str, list);

3:execute()启动进程

1:使用了execute来启动进程,信号是无效的
2:主进程一直处于阻塞状态,等待被调用的QTcpClientTest.exe完成(关闭软件)

	QProcess* process = new QProcess(this);QString str = QApplication::applicationDirPath() + "/QTcpClientTest.exe";QStringList list;list.append("bbbbb");list.append("aaaaa");//无效connect(process, &QProcess::started, this, [=](){qDebug() << "started:";});//无效connect(process, &QProcess::readyReadStandardOutput, this, [=](){QString qstr(process->readAllStandardOutput());qDebug() << "readyReadStandardOutput:" << qstr;});//无效connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [=](int exitCode, QProcess::ExitStatus exitStatus){QString result = process->readAll();qDebug() << "result:" << result;});//无效connect(process, &QProcess::stateChanged, this, [=](QProcess::ProcessState state){qDebug() << "show state:";switch (state){case QProcess::NotRunning:qDebug() << "Not Running";break;case QProcess::Starting:qDebug() << "Starting";break;case QProcess::Running:qDebug() << "Running";break;default:qDebug() << "otherState";break;}});//如果进程 QTcpClientTest 不关闭 或者完成 , 则此进程一直卡住int exitCode = QProcess::execute(str, list);if (exitCode != 0) {qDebug() << "外部程序执行失败";}//接受进程捕获到输出的消息QByteArray output = process->readAllStandardOutput();QString msg = QString::fromLocal8Bit(output);qDebug() << msg;

打印的信息为:QIODevice::read (QProcess): device not open,说明execute没有打开设备,接受不到消息

4:start() + waitForFinished()启动进程

1:使用了execute来启动进程,信号是无效的
2:主进程一直处于阻塞状态,等待被调用的QTcpClientTest.exe完成(关闭软件)

	QProcess* process = new QProcess(this);QString str = QApplication::applicationDirPath() + "/QTcpClientTest.exe";QStringList list;list.append("bbbbb");list.append("aaaaa");//启动进程process->start(str,list);// 等待进程完成process->waitForFinished();//接受进程捕获到输出的消息QByteArray output = process->readAllStandardOutput();QString msg = QString::fromLocal8Bit(output);qDebug() << msg;

完整代码:
QProcess完整学习代码

参考博客:
QProcess使用 一
QProcess使用 二
QProcess使用 三
QProcess使用 四

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++入门基础(万字详解!!!)

文章目录 前言1.C关键字2.命名空间3.C的输入输出4.缺省参数4.1 全缺省4.2 半缺省 5.函数重载6. 引用6.1 引用的特性6.2 引用的使用场景6.3 引用和指针 7.内联函数7.1 特性 8.auto关键字8.1 注意事项 9. 基于范围的for循环9.1 使用条件 10.指针控制nullptr10.1 注意事项 11.总结…

fastadmin 自定义搜索分类和时间范围

1.分类搜索&#xff0c;分类信息获取----php 2.对应html页面&#xff0c;页面底部加搜索提交代码&#xff08;这里需要注意&#xff1a;红框内容&#xff09; 图上代码----方便直接复制使用 <script id"countrySearch" type"text/html"><!--form…

安全 1自测

常见对称加密算法&#xff1a; DES&#xff08;Data Encryption Standard&#xff09;&#xff1a;数据加密标准&#xff0c;速度较快&#xff0c;适用于加密大量数据的场合&#xff1b; 3DES&#xff08;Triple DES&#xff09;&#xff1a;是基于DES&#xff0c;对一块数据用…

Spring相关面试题

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱写博客的嗯哼&#xff0c;爱好Java的小菜鸟 &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;个人博客&#xff1a;敬请期待 &#x1f4d5;系列…

时序预测 | MATLAB实现EEMD-GRU、GRU集合经验模态分解结合门控循环单元时间序列预测对比

时序预测 | MATLAB实现EEMD-GRU、GRU集合经验模态分解结合门控循环单元时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-GRU、GRU集合经验模态分解结合门控循环单元时间序列预测对比效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 1.MATLAB实现EEMD-GRU、GRU时…

springcloud+nacos实现灰度发布

灰度发布 gateway网关实现灰度路由 灰度发布实体 package com.scm.boss.common.bean;import lombok.Data; import lombok.experimental.Accessors;import java.io.Serializable;/*** 灰度发布实体*/ Data Accessors(chain true) public class GrayBean implements Serializ…

【Linux】—— 进程程序替换

目录 序言 &#xff08;一&#xff09;替换原理 1、进程角度——见见猪跑 1️⃣ 认识 execl 函数 2、程序角度——看图理解 &#xff08;二&#xff09;替换函数 1、命名理解 2、函数理解 1️⃣execlp 2️⃣execv 3️⃣execvp 4️⃣execle 5️⃣execve 6️⃣execve…

机器学习重要内容:特征工程之特征抽取

目录 1、简介 2、⭐为什么需要特征工程 3、特征抽取 3.1、简介 3.2、特征提取主要内容 3.3、字典特征提取 3.4、"one-hot"编码 3.5、文本特征提取 3.5.1、英文文本 3.5.2、结巴分词 3.5.3、中文文本 3.5.4、Tf-idf ⭐所属专栏&#xff1a;人工智能 文中提…

LLaMA长度外推高性价比trick:线性插值法及相关改进源码阅读及相关记录

前言 最近&#xff0c;开源了可商用的llama2&#xff0c;支持长度相比llama1的1024&#xff0c;拓展到了4096长度&#xff0c;然而&#xff0c;相比GPT-4、Claude-2等支持的长度&#xff0c;llama的长度外推显得尤为重要&#xff0c;本文记录了三种网络开源的RoPE改进方式及相…

Vue-打印组件页面

场景: 需要将页面的局部信息打印出来&#xff0c;只在前端实现&#xff0c;不要占用后端的资源。经过百度经验&#xff0c;决定使用 print-js和html2canvas组件。 1. 下载包 npm install print-js --save npm install --save html2canvas 2. 组件内引用 <script>impo…

C语言之数组指针和指针数组

C语言之数组指针和指针数组 一、含义二、定义2.1 指针数组2.2 数组指针 三、使用3.1 指针数组在参数传递时的使用3.1.1 指针数组的排序3.2 数组指针在参数传递时的使用 一、含义 指针数组&#xff1a;顾名思义&#xff0c;其为一个数组&#xff0c;数组里面存放着多个指针&…

C#生成随机验证码

以下是一个简单的C#验证码示例&#xff1a; private void GenerateCaptcha() {// 生成随机字符串string chars "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";Random random new Random();string captchaString new string(Enumerable.Repe…

TPAMI, 2023 | 用压缩隐逆向神经网络进行高精度稀疏雷达成像

CoIR: Compressive Implicit Radar | IEEE TPAMI, 2023 | 用压缩隐逆向神经网络进行高精度稀疏雷达成像 注1:本文系“无线感知论文速递”系列之一,致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于Nature/Science及其子刊;MobiCom, Sigcom, MobiSy…

Java【算法 04】HTTP的认证方式之DIGEST认证详细流程说明及举例

HTTP的认证方式之DIGEST 1.是什么2.认值流程2.1 客户端发送请求2.2 服务器返回质询信息2.2.1 质询参数2.2.2 质询举例 2.3 客户端生成响应2.4 服务器验证响应2.5 服务器返回响应 3.算法3.1 SHA-2563.1.1 Response3.1.2 A13.1.3 A2 3.2 MD53.2.1 Request-Digest3.2.2 A13.2.3 A2…

CSS3 中新增了哪些常见的特性?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 圆角&#xff08;Border Radius&#xff09;⭐ 渐变&#xff08;Gradients&#xff09;⭐ 阴影&#xff08;Box Shadow&#xff09;⭐ 文本阴影&#xff08;Text Shadow&#xff09;⭐ 透明度&#xff08;Opacity&#xff09;⭐ 过渡&…

Spring boot与Spring cloud 之间的关系

Spring boot与Spring cloud 之间的关系 Spring boot 是 Spring 的一套快速配置脚手架&#xff0c;可以基于spring boot 快速开发单个微服务&#xff0c;Spring Boot&#xff0c;看名字就知道是Spring的引导&#xff0c;就是用于启动Spring的&#xff0c;使得Spring的学习和使用…

MATLAB中xlsread函数用法

目录 语法 说明 示例 将工作表读取到数值矩阵 读取元胞的范围 读取列 请求数值、文本和原始数据 对工作表执行函数 请求自定义输出 局限性 xlsread函数的功能是读取Microsoft Excel 电子表格文件 语法 num xlsread(filename) num xlsread(filename,sheet) num x…

Nacos和GateWay路由转发NotFoundException: 503 SERVICE_UNAVAILABLE “Unable to find

问题再现&#xff1a; 2023-08-15 16:51:16,151 DEBUG [reactor-http-nio-2][CompositeLog.java:147] - [dc73b32c-1] Encoding [{timestampTue Aug 15 16:51:16 CST 2023, path/content/course/list, status503, errorService Unavai (truncated)...] 2023-08-15 16:51:16,17…

leetcode27—移除元素

思路&#xff1a; 参考26题目双指针的思想&#xff0c;只不过这道题不是快慢指针。 看到示例里面数组是无序的&#xff0c;也就是说后面的元素也是可能跟给定 val值相等的&#xff0c;那么怎么处理呢。就想到了从前往后遍历&#xff0c;如果left对应的元素 val时&#xff0c…

汽车制造业上下游协作时 外发数据如何防泄露?

数据文件是制造业企业的核心竞争力&#xff0c;一旦发生数据外泄&#xff0c;就会给企业造成经济损失&#xff0c;严重的&#xff0c;可能会带来知识产权剽窃损害、名誉伤害等。汽车制造业&#xff0c;会涉及到重要的汽车设计图纸&#xff0c;像小米发送汽车设计图纸外泄事件并…