QT5.14.2深入解析Qt QProcess用法之彻底掌控进程操作技巧


通过今天的文章,我将带领大家彻底理解和掌握Qt QProcess的使用技巧,这将成为你控制进程的利器。我们的讨论将通过明确的示例,详细的代码案例,结合我在实际软件开发经验中遇到的问题进行说明。


1、Qt QProcess - 什么是进程?


在理解Qt QProcess之前,让我们先了解什么是进程。进程是操作系统的一个核心概念。当程序在执行时,它将产生多个进程,每个进程都有自己独立的数据空间,这样就可以同时有多个用户执行同一程序,而不会产生冲突。进程的状态有:新生、执行、等待、就绪和结束。每个进程都有自己的唯一标识符,我们称之为PID。


2、Qt QProcess - 如何操作?


在Qt中,我们可以使用QProcess类来操作进程。这个类包含一系列功能丰富的函数,用于启动并控制外部进程。QProcess是QIODevice的子类,这让我们可以使用各种I/O函数来交互,并使得传输变得轻而易举。


3、QProcess实例 - 打开文本编辑器


以下是在Windows系统下如何用QProcess打开文本编辑器的简单示例。在这个例子中,我们设定了工作目录为"C:\Windows\System32",然后启动"notepad.exe"程序并等待它结束。

QString filename="TEST.txt";
QProcess process;
process.setWorkingDirectory("C:\\Windows\\System32");
process.start("notepad.exe", QStringList()<<filename);
process.waitForFinished(-1); //等待进程结束

4、QProcess更多功能 - 利用信号和槽


Qt的一个主要特点是其信号和槽的机制,QProcess也不例外。你可以连接各种信号,比如started()、finished()、stateChanged()等,到你的槽函数中去进行响应。


例如,可以这样处理started和finished信号:

process = new QProcess();
connect(process, SIGNAL(started()), SLOT(started()));
connect(process, SIGNAL(finished(int,QProcess::ExitStatus)), SLOT(finished()));

然后在槽函数中可以获取返回的数据和状态,比如:

void Widget::finished(intexitCode,QProcess::ExitStatus exitStatus)
{qDebug()<<"finished";qDebug()<<exitCode; // 被调用程序的main返回的intqDebug()<<exitStatus; // QProcess::ExitStatus(NormalExit)qDebug() <<"finished-output-readAll:";qDebug()<<QString::fromLocal8Bit(process->readAll());qDebug()<<"finished-output-readAllStandardOutput:";qDebug()<<QString::fromLocal8Bit(process->readAllStandardOutput());
}

5、QProcess注意事项


(1)、关于start和startDetached

在QProcess中,start()startDetached()函数提供了两种不同的启动进程的方式。虽然他们在大部分情况下能达到相同的效果,但在某些方面有着重要的不同。具体如下:


  • 生命周期start()函数创建的进程的生命周期与创建它的QProcess对象的生命周期相绑定。也就是说,当QProcess对象被销毁时,由它启动的进程也会被销毁。相比之下,startDetached()函数则会创建一个独立的进程,即使创建它的QProcess对象被销毁,启动的进程也会继续运行。


  • 输入/输出:只有start()启动的进程可以使用QProcess类的一些重要功能。例如,使用setStandardInputFile()设置进程的标准输入,或者用readAllStandardOutput()和readAllStandardError()来获取进程的标准输出和标准错误。而startDetached()启动的进程则没有这样的功能,它的输入/输出不能由创建它的QProcess对象所控制。


  • 进程间通信start()启动的进程可以利用QProcess的信号/槽机制进行通信,例如用readyReadStandardOutput()和readyReadStandardError()信号获取到输出信息,并进行处理。而startDetached()则无法实现此类通信。


所以说,从上面的说明中,如果你需要对创建的进程进行控制的话,推荐使用start()函数。而如果你只是需要创建一个独立的进程,那么startDetached()可能会是更好的选择。


(2)、在QProcess中如何处理进程错误信息?

在QProcess中处理进程错误信息主要依靠信号和槽的机制实现。QProcess得到了很好的封装,因此,当有错误发生的时候,会发出errorOccurred信号。

下面是一段示例代码,提交了一个错误的外部进程路径,我们用errorOccurred信号来捕获错误,并在槽函数中处理。

#include <QCoreApplication>
#include <QProcess>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QProcess process;QObject::connect(&process, &QProcess::errorOccurred,[&process](QProcess::ProcessError error){qDebug() << "Error Occurred. Reason:" << error;qDebug() << process.errorString();});process.start("nonExistingProgram"); // This will emit an errorreturn a.exec();
}

在这个例子中,连接了QProcess的errorOccurred信号到一个匿名函数中。当有错误发生时,匿名函数会进入执行,打印错误的原因和错误信息,达到了错误处理的目的。


6、实战案例:使用QProcess类执行Python脚本并获取返回值


接下来为你展示一个更复杂的使用QProcess的例子,以便你更好地理解QProcess的运用。

在这个例子中,我将展示如何使用QProcess类执行一个Python脚本,并从脚本的输出获取返回值。这里假设我们有一个Python脚本,名为"script.py",其内容如下:

python

print("Hello from Python!")

我们将使用QProcess来执行这个脚本,并从其输出中捕获打印的字符串。以下是具体的C++代码:

// Basic includes for the Qt
#include <QProcess>
#include <QDebug>int main() {QProcess pythonScript;pythonScript.start("python", QStringList() << "path-to-your-python-script.py");pythonScript.waitForFinished(-1); // Will wait forever until finishedQString outputString(pythonScript.readAllStandardOutput());qDebug() << "Python script output: " << outputString;return 0;
}

在上述代码中,我们首先创建了一个QProcess实例。然后,使用start方法开启一个新的进程来运行我们的Python脚本。此过程需要两个参数,第一个是要执行的命令(在这里为"python"),第二个是这个命令的参数(在这里为我们的脚本路径)。


运行这段代码,结果将会在控制台输出 “Python script output: Hello from Python!”,证明我们成功获取了Python脚本的输出。

虽然这个例子相比前面介绍的单行命令更复杂,但是核心的流程和思想是一致的:我们使用QProcess来启动一个进程,然后通过标准输出获取进程的返回结果。


这种方法的威力在于它能与任何支持命令行输入/输出的程序进行交互,不只是Python脚本,还可以是其他类型的脚本或应用,极大地扩展了QProcess的应用范围。


结语

接下来,我们将介绍更多关于使用QProcess进行进程操作的内容,但是在本文中我们就先讲到这。在下一篇文章中,我将带领大家继续探索QProcess的更多功能,包括如何在程序中使用QProcess处理进程的输出流,如何通过main接收参数,以及如何返回main参数等。记住,掌握QProcess,就等于掌握了进程操作的钥匙,让我们拭目以待!

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

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

相关文章

计算机基础入门2:GPU

GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理器&#xff09;又被称作显示核心、视觉处理器、显示芯片&#xff0c;是一种专为并行处理而设计的微型处理器&#xff0c;非常擅长处理大量简单任务&#xff0c;包括图形和视频渲染。 GPU根据接入系统方式分为集成…

密码学——数字签名

数字签名 引言数字签名签名方案直接数字签名EIGamal 数字签名方案公钥和私钥对的产生签名的产生签名的验证Schnorr 数字签名方案公钥和私钥生成签名生成签名验证证书和认证中心引言 消息认证可以保护双方不受第三方的攻击,但是消息认证不能处理双方自身发生的攻击。如接受方可…

深度学习_卷积

卷积 卷积&#xff08;Convolution&#xff09;是数学和计算机科学中的一个重要概念&#xff0c;特别在信号处理和图像处理中应用广泛。在信号处理领域&#xff0c;卷积是两个函数之间的一种数学操作&#xff0c;它表示两个函数的重叠部分的积分量。 在图像处理中&#xff0c…

【Excel自动化办公】使用openpyxl对Excel进行读写操作

目录 一、环境安装 1.1 创建python项目 1.2 安装openpyxl依赖 二、Excel数据读取操作 三、Excel数据写入操作 3.1 创建空白工作簿 3.2 写数据 四、设置单元格样式 4.1 字体样式 4.2 设置单元格背景填充色 4.3 设置单元格边框样式 4.4 单元格对齐方式 4.5 数据筛选…

打造精益标杆生产线:从理念到实践的全面升级!

在制造业竞争日益激烈的今天&#xff0c;精益生产已成为企业提升效率、降低成本、增强竞争力的重要手段。那么&#xff0c;如何打造一条精益标杆生产线呢&#xff1f;本文&#xff0c;天行健精益制造咨询公司将从理念导入、流程优化、员工培训、持续改进等方面&#xff0c;为大…

MybatisPlus逆向工程

目录 &#x1f9c2;1.前提说明 &#x1f37f;2.引入依赖 &#x1f32d;3.使用导入模板 1.前提说明 注意 适用版本&#xff1a;mybatis-plus-generator 3.5.1 以下版本&#xff0c;3.5.1 及以上的请参考 3.5.1以上参考官网&#xff1a;3.5.1以上逆向工程 2.引入依赖 …

【Java Web基础】一些网页设计基础(一)

文章目录 1. 父盒子下子盒子的左右浮动布局2. 浮动布局中&#xff0c;高度较小的盒子撑起整个盒子的高度3. 在2中&#xff0c;logo和title都是顶着放置的&#xff0c;让logo和title垂直居中4. 字体大小自适应5. 响应式布局 1. 父盒子下子盒子的左右浮动布局 父盒子CSS&#xff…

汽车制造产生的污废水如何处理排放

汽车制造业是一个重要的工业领域&#xff0c;然而&#xff0c;伴随着汽车制造过程中的各种化学反应和材料加工&#xff0c;大量污废水也随之产生。为了保护环境和社会的可持续发展&#xff0c;汽车制造产生的污废水需要得到妥善处理和排放。 首先&#xff0c;针对汽车制造中涉及…

二阶段提交的理解

两阶段提交2PC是分布式事务中最强大的事务类型之一&#xff0c;两段提交就是分两个阶段提交&#xff1a; 第一阶段询问各个事务数据源是否准备好。第二阶段才真正将数据提交给事务数据源。 为了保证该事务可以满足ACID&#xff0c;就要引入一个协调者&#xff08;Cooradinator…

20240318-算法复习打卡day27||● 39. 组合总和● 40.组合总和II● 131.分割回文串

39. 组合总和 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {if (sum target) {result.push_back(path);return;}for (int i star…

如何使用phpStudy在Windows系统部署静态站点并实现无公网IP远程访问

文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…

Zookeeper(二)一致性协议2PC,3PC

目录 1.1 2PC协议1.1.1 协议说明1.1.2 优缺点同步阻塞单点问题数据不一致容错性不好 1.2 3PC 协议1.2.1 协议说明1.2.2 优缺点 官网&#xff1a;Apache ZooKeeper 1.1 2PC协议 2PC&#xff0c;是Two-Phase Commit的缩写&#xff0c;即二阶段提交&#xff0c;是计算机网络尤其…

Java实现定时发送邮件(基于Springboot工程)

1、功能概述&#xff1f; 1、在企业中有很多需要定时提醒的任务&#xff1a;如每天下午四点钟给第二天的值班人员发送值班消息&#xff1f;如提前一天给参与第二天会议的人员发送参会消息等。 2、这种定时提醒有很多方式如短信提醒、站内提醒等邮件提醒是其中较为方便且廉价的…

upload-labs·文件上传(靶场攻略)

目录 1.文件上传漏洞 1.1.文件上传漏洞介绍 1.2.文件上传漏洞危害 1.3.文件上传漏洞满足条件 1.4.文件检测流程 1.5.文件上传思路 1.6.web界面存在的风险点 1.7.文件上传实战思路 2.靶场搭建 3.文件上传 3.1.upload-labs第一关 3.2.检测文件类型 3.2.1.基本概念 3…

webconfig-boot分布式项目Web一站式配置

1、前言 最近利用空余时间写了一个项目webconfig-boot 。该项目主要配置了web项目常用的一些配置&#xff0c;如统一参数校验、统一异常捕获、统一日期的处理、常用过滤器、常用注解等。引入依赖接口完成常规的web配置。 这里也是总结了笔者在项目开发中遇到的一些常用的配置…

基于Spring Boot的社区垃圾分类管理平台的设计与实现

摘 要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;社区垃圾分类管理平台利用计算机网络实现信息化管理&#xff0c;使整个社区垃圾分类管理的发展和服务水平有显著提升。 本文拟…

LLM流式方案解决方案和客户端解决方案

背景 接上一篇《LLM大模型统一封装接口解决方案》架构确定后&#xff0c;流式方案非常规请求&#xff0c;需要特殊处理。 本解决方案就是针对上一篇中所需要的流式&#xff08;打字机效果进行编码&#xff09; 什么是SSE SSE&#xff08;Server-Sent Events&#xff0c;服务器发…

C++初阶:string类的模拟自实现

目录 1. 引子2. 自实现string类功能模块3. string类功能模块的具体实现3.1 默认成员函数3.2 遍历访问相关成员函数3.3 信息插入相关成员函数3.4 信息删除3.5 信息查找3.6 非成员函数3.7 杂项成员函数 4. 补充知识 1. 引子 通过对string类的初步学习&#xff0c;没有对知识进行较…

MRP(VBA系列):6.SIOP:将PO的信息加入到Net后面

这个比较简单&#xff0c;就是将两个表格的信息组合起来。 Tips&#xff1a;所有代码都是为目前任职公司编写&#xff0c;极大概率不适合其他公司&#xff0c;在这里发布&#xff1a;首先是记录&#xff1b;其次才是分享&#xff0c;望理解&#xff01; 效果图&#xff1a; 思…

聚合音乐网-播放器网站源码

源码简介 MKOnlineMusicPlayer 是一款全屏的音乐播放器 UI 框架&#xff08;为避免侵权&#xff0c;已移除所有后端功能&#xff09;。 前端界面参照 QQ 音乐网页版进行布局&#xff0c;同时采用了流行的响应式设计&#xff0c;无论是在PC端还是在手机端&#xff0c;均能给您…