C++ Qt开发:QProcess进程管理模块
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QProcess
组件实现针对进程的控制管理等。
当你在使用Qt进行跨平台应用程序开发时,经常需要与外部进程进行交互,这时就可以利用Qt的QProcess
模块。QProcess
模块提供了启动和控制外部进程的功能,能够执行外部命令、运行其他可执行文件,以及与外部进程进行通信。通过QProcess
,可以方便地执行命令行命令、调用系统工具、执行脚本等。QProcess
还可以捕获外部进程的输出,以及监视外部进程的运行状态,从而实现更灵活、高效的进程管理。
以下是QProcess
类的一些常用函数及其解释的表格:
函数 | 描述 |
---|---|
start(const QString &program, const QStringList &arguments) |
启动一个新的进程,program 参数指定要执行的程序,arguments 参数指定传递给程序的参数列表。 |
startDetached(const QString &program, const QStringList &arguments) |
启动一个新的进程,但不会等待进程退出,也不会将输出传递给调用进程。 |
waitForStarted(int msecs = 30000) |
等待进程启动,如果在指定时间内进程没有启动,将返回false。 |
waitForFinished(int msecs = 30000) |
等待进程退出,如果在指定时间内进程没有退出,将返回false。 |
readAllStandardOutput() |
读取进程的标准输出,并返回为QByteArray 。 |
readAllStandardError() |
读取进程的标准错误输出,并返回为QByteArray 。 |
write(const QByteArray &data) |
向进程的标准输入写入数据。 |
closeWriteChannel() |
关闭进程的标准输入。 |
kill() |
终止进程。 |
terminate() |
终止进程。 |
start(const QString &program) |
启动一个新的进程,program 参数指定要执行的程序。 |
setWorkingDirectory(const QString &dir) |
设置进程的工作目录。 |
state() |
返回进程的当前状态。 |
error() |
返回进程的错误状态。 |
pid() |
返回进程的进程ID。 |
waitForBytesWritten(int msecs = 30000) |
等待写入到进程的数据已经被完全写入。 |
waitForReadyRead(int msecs = 30000) |
等待进程有数据可读。 |
startDetached(const QString &program) |
启动一个新的进程,但不会等待进程退出,也不会将输出传递给调用进程。 |
setProcessChannelMode(QProcess::ProcessChannelMode mode) |
设置进程通信模式,可选值包括QProcess::SeparateChannels 和QProcess::MergedChannels 。 |
这些函数提供了控制进程的各种方法,可以实现启动、监视、控制和与外部进程进行交互的功能。
进程控制模块可以实现对特定进程的启动关闭,本章将以执行命令行为例,通过调用Start()
可以拉起一个第三方进程。
QProcess
类的start()
函数有几种不同的重载形式,但最常用的是以下形式:
bool QProcess::start(
const QString &program,
const QStringList &arguments,
QIODevice::OpenMode mode = ReadWrite
)
函数用于启动一个新的进程,并执行指定的程序(program
参数)。arguments
参数指定了传递给程序的参数列表,它是一个QStringList
类型的参数,可以为空。mode
参数指定了启动进程时打开的模式,默认为ReadWrite
。函数返回一个bool
类型的值,表示进程是否成功启动。
当调用start()
执行命令后,我们则可以通过readAllStandardOutput()
函数从进程的标准输出中读取所有可用的数据,并将其返回为 QByteArray
对象。
QByteArray QProcess::readAllStandardOutput()
这个函数没有参数,它会立即返回当前可用的标准输出数据,并将输出数据作为字节数组返回。如果没有可用的输出数据,它将返回一个空的字节数组。
当然了,与之对应的readAllStandardError()
是函数,该函数可以用于从进程的标准错误输出中读取所有可用的数据,并将其返回为 QByteArray
对象。
QByteArray QProcess::readAllStandardError()
该函数同样没有参数,它会立即返回当前可用的标准错误输出数据,并将输出数据作为字节数组返回。如果没有可用的错误输出数据,它将返回一个空的字节数组。
1.1 获取进程信息
此处我们以输出系统进程信息为例,通常可以调用tasklist /FO CSV
来获取系统中的进程列表,并将其输出为CSV
格式,通过调用如下函数则可以获取到系统进程信息。
process.start("tasklist", QStringList() << "/FO" << "CSV");
此时通过调用readAllStandardOutput
函数我们可以将缓冲区内的数据读出并将其放入到一个QString
类型变量内;
QString output = process.readAllStandardOutput();
当具备了这个列表后,就可以根据冒号来逐行读入并切割,通过循环的方式将其追加到treeWidget
组件内,并以此来实现展示的效果;
void MainWindow::on_pushButton_clicked()
{
CallProcess();
ui->treeWidget->clear();
QProcess process;
process.start("tasklist", QStringList() << "/FO" << "CSV");
if (process.waitForFinished())
{
QString output = process.readAllStandardOutput();
output.replace("\"", "");
QStringList lines = output.split("\n");
// 跳过第一行标题
for(int i = 1; i < lines.size(); ++i)
{
QStringList fields = lines[i].split(",");
// 确保至少有五个字段
if(fields.size() >= 5)
{
QStringList rowData;
for(int j = 0; j < 5; ++j)
{
rowData << fields[j].trimmed();
}
ui->treeWidget->addTopLevelItem(new QTreeWidgetItem(rowData));
}
}
// 设置列标题
ui->treeWidget->setHeaderLabels(QStringList() << "进程名称" << "PID" << "会话名称" << "Session"<< "内存占用");
} else
{
QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
item->setText(0, "Failed to execute tasklist command.");
}
}
运行后当点击输出系统进程时则可以看到完整的进程输出效果,如下图所示;
使用此方法我们可以很好的读取到系统中的各种信息,只要能够合理的过滤出想要的字段即可,当需要输出系统信息时我们可以通过process.start("systeminfo")
调用系统命令获取到,如下代码所示;
void MainWindow::on_pushButton_2_clicked()
{
ui->treeWidget->clear();
// 获取系统信息
QProcess process;
process.start("systeminfo");
if (process.waitForFinished())
{
QByteArray output = process.readAllStandardOutput();
// 使用正确的文本编码对输出进行解码
QTextCodec *codec = QTextCodec::codecForName("GBK");
QString text = codec->toUnicode(output);
QStringList lines = text.split("\n");
for (const QString &line : lines)
{
// 解析系统信息,添加到 QTreeWidget 中
QStringList fields = line.split(":", Qt::SkipEmptyParts);
if (fields.size() >= 2)
{
QString property = fields[0].trimmed();
QString value = fields[1].trimmed();
QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
item->setText(0, property);
item->setText(1, value);
}
}
// 设置列标题
ui->treeWidget->setHeaderLabels(QStringList() << "系统信息" << "数值");
} else
{
QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
item->setText(0, "Failed to execute systeminfo command.");
}
}
运行后当用户点击输出系统信息按钮时,因systeminfo
运行时间较长所以需要等待一段时间,输出效果如下图所示;
C++ Qt开发:QProcess进程管理模块的更多相关文章
- Swoole 进程管理模块 Process 之单进程的使用
PHP 自带的 pcntl,存在很多不足,如: 没有提供进程间通信的功能: 不支持重定向标准输入和输出: 只提供了 fork 这样原始的接口,容易使用错误: Swoole\Process 提供了如下特 ...
- supervisor python开发的进程管理工具
Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动.重启.关闭进程(不仅仅是 Python 进程).除了对单个进程的 ...
- Android内存进程管理机制
参考文章: http://www.apkbus.com/android-104940-1-1.htmlhttp://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.h ...
- Swoole 源码分析——进程管理 Swoole_Process
前言 swoole-1.7.2 增加了一个进程管理模块,用来替代 PHP 的 pcntl 扩展. PHP自带的pcntl,存在很多不足,如 pcntl 没有提供进程间通信的功能 pcntl 不支持重定 ...
- Python::OS 模块 -- 进程管理
os模块的简介参看 Python::OS 模块 -- 简介 os模块的文件相关操作参看 Python::OS 模块 -- 文件和目录操作 os模块的进程参数 Python::OS 模块 -- 进程参数 ...
- Webpack: 为Web开发而生的模块管理器[转]
Webpack: 为Web开发而生的模块管理器 原文地址:http://hanjianwei.com/2014/09/10/webpack-package-manager-for-web/ 10 Se ...
- atitit.软件开发GUI 布局管理优缺点总结java swing wpf web html c++ qt php asp.net winform
atitit.软件开发GUI 布局管理优缺点总结java swing wpf web html c++ qt php asp.net winform 1. Absoluti 布局(经常使用) 1 2. ...
- Nginx学习笔记1-Nginx功能模块以及进程管理
1. 功能 1.1. 功能描述 使用缓存加速反向代理,简单负载均衡和容错: 使用缓存机制加速远程FastCGI服务器的访问: 模块化结构: 基本的HTTP功能: 邮 ...
- ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块
之前的My Blog提供了列表的展示和文章显示功能,但是所有数据仍然只能通过数据库录入,为了完成最初的角色“作者”的用例,本章将介绍如何使用“Area”实现My Blog的管理功能. 根据功能分离代码 ...
- Winform开发框架之通用附件管理模块 --SNF快速开发平台3.3-Spring.Net.Framework
最近项目太多都没有时间写文章了,实际项目需求一,CS端和windows平板都需要附件上传管理功能.以前做的都是BS的附件管理和上传功能.本来计划在Winform上嵌套一个浏览器直接用bs的附件上传功能 ...
随机推荐
- 蔚来杯2022牛客暑期多校训练营3 AC
比赛链接 A 题解 知识点:LCA. 队友写的,俺不会qwq.预处理出关键点序列的在树A B上的前缀LCA和后缀LCA,枚举去掉的关键节点并使用前后缀LCA算出剩余节点的LCA比较权值即可. 时间复杂 ...
- NC51216 花店橱窗
题目链接 题目 题目描述 小q和他的老婆小z最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里. 但是他们有很多花瓶,每个花瓶都具有各自的特点,因此,当各个花瓶中放入不同的花束时,会产生不同的美学 ...
- MOS 管工作原理
浅谈MOS管的工作原理_数字IC修行者的博客-CSDN博客_mos管工作原理 一文讲明白MOS管工作原理 - 知乎 (zhihu.com) 闪存基本原理 (sohu.com)
- Python 虚拟环境 virtualenv 笔记
初始化 virtualenv 方式一: virtualenv 安装 virtualenv, 不用sudo的话, 是安装到用户home目录下 pip install virtualenv # 此时如果 ...
- ASP.NET Core 微信支付(二)【 发布到服务器上签名加密时报错:系统找不到指定的文件 APIV3】
参考资料 .Net微信支付退款操作"系统找不到指定的文件" 错误现象 微信支付(API v3)的统一下单接口和订单查询接口在本地调试成功,可以使用,但是发布到服务器上之后调用接口就 ...
- RabbitMQ零碎整理,总有一天在你工作中会用到
概念 MQ:消息队列(消息中间件),开源的基于AMQP协议的消息中间件,异步 解耦 削峰 核心作用:1.异步 2.解耦 3.消息通信 RabbitMQ 消息的类型:1.点对点 2.Worker 3.发 ...
- 【Azure K8S | AKS】在AKS中创建 StatefulSet 示例
问题描述 [Azure K8S | AKS]在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例 [Azure K8S|AKS]进 ...
- TLS数据包重组
TLS解密 参考以下链接:Wireshark 解密 TLS报文_在线tls解密-CSDN博客 总结: 配置环境变量 wireshark首选项配置 TLS解密例子 Frame 2700 Frame 27 ...
- AntSK:打造你的本地AI知识库——离线运行详细教程
亲爱的读者朋友们,今天我要给大家介绍一个强大的开源工具--AntSK.这个工具能让您在没有Internet连接时依然能使用人工智能知识库对话和查询,想象一下,即使在无网络的环境中,您也能与AI进行愉快 ...
- mysql-添加、删除索引
-- 添加联合唯一索引 alter table b_report_file add unique index nc (name, code, org_id); -- 删除索引 ALTER TABLE ...