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时…

【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…

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;⭐ 过渡&…

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;像小米发送汽车设计图纸外泄事件并…

[足式机器人]Part5 机械设计 Ch00/01 绪论+机器结构组成与连接 ——【课程笔记】

本文仅供学习使用 本文参考&#xff1a; 《机械设计》 王德伦 马雅丽课件与日常作业可登录网址 http://edu.bell-lab.com/manage/#/login&#xff0c;选择观摩登录&#xff0c;查看2023机械设计2。 机械设计-Ch00Ch01——绪论机器结构组成与连接 Ch00-绪论0.1 何为机械设计——…

12.Eclipse导入Javaweb项目

同事复制一份他的项目给我ekp.rar (懒得从SVN上拉取代码了)放在workspace1目录下 新建一个文件夹 workspace2&#xff0c;Eclipse切换到workspace2工作空间 选择Import导入 选择导入的项目(这里是放到workspace1里面) 拷贝一份到workspace2里面 例子 所有不是在自己电脑上开发…

可白嫖的4家免费CDN,并测试其网络加速情况(2023版)

网站加载速度优化过程中&#xff0c;不可避免的会用上CDN来加速资源的请求速度。但是市面上的CDN资源几乎都是要收费的&#xff0c;而且价格还不便宜&#xff0c;对于小公司站长来讲&#xff0c;这将是一笔不小的开销。不过还是有一些良心公司给我们提供了免费的资源&#xff0…

Redis_亿级访问量数据处理

11. 亿级访问量数据处理 11.1 场景表述 手机APP用户登录信息&#xff0c;一天用户登录ID或设备ID电商或者美团平台&#xff0c;一个商品对应的评论文章对应的评论APP上有打卡信息网站上访问量统计统计新增用户第二天还留存商品评论的排序月活统计统计独立访客(Unique Vistito…

【BEV】3D视觉 PRELIMINARY

这里的知识来自于论文 Delving into the Devils of Bird’s-eye-view Perception: A Review, Evaluation and Recipe 的 Appendix B.1 部分来自 这篇文章 从透视图转向鸟瞰图。&#xff08;Xw、Yw、Zw&#xff09;、&#xff08;Xc、Yc、Zc&#xff09;表示世界World坐标和相…