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的附件上传功能 ...
随机推荐
- Python枚举类型enum
为什么需要枚举 枚举(Enum)是一种数据类型,也是一种特别的类,是绑定到唯一值的符号表示,可以使用它来创建用于变量和属性的常量集枚举类可以看成是一个下拉菜单,给出特定的选项且这些选项不可修改,更贴近 ...
- MySQL基础之DCL语句
DCL(Data Control Language)语句:数据控制语句. 用途:控制数据库.表.字段.用户的访问权限和安全级别. 常用关键字:grant.revoke等 一般用于管理数据库和用户的权限 ...
- Spring Boot 加载外部配置文件
Spring Boot 允许你从外部加载配置,这样的话,就可以在不同的环境中使用相同的代码.支持的外部配置源包括:Java属性文件.YAML文件.环境变量.命令行参数. 用@Value注解可以将属性值 ...
- 基于keras的时域卷积网络(TCN)
1 前言 时域卷积网络(Temporal Convolutional Network,TCN)属于卷积神经网络(CNN)家族,于2017年被提出,目前已在多项时间序列数据任务中击败循环神经网络(RNN ...
- Linux Ubuntu 遇到的一些问题
Ubuntu 国内下载地址:https://mirrors.tuna.tsinghua.edu.cn/# 1. 安装一些常用的软件时,需要下载 amd.deb 类型的包,并使用下面命令安装 sudo ...
- ASP.NET Core 微信支付(二)【 发布到服务器上签名加密时报错:系统找不到指定的文件 APIV3】
参考资料 .Net微信支付退款操作"系统找不到指定的文件" 错误现象 微信支付(API v3)的统一下单接口和订单查询接口在本地调试成功,可以使用,但是发布到服务器上之后调用接口就 ...
- 【Azure 应用服务】Azure Function Timer触发函数加上Singleton后的问题
问题描述 在Azure Function Timer Trigger的函数中,添加了Singleton属性,当Function的实例变为3个后,发现Timer函数并没有在三个实例上同时运行,每次触发时 ...
- python执行JavaScript代码出现编码问题的解决方案
当我们安装好nodejs环境,想在python代码中去调用JavaScript代码,常常会出现编码的问题. 举个例子: python代码如下: 点击查看代码 import execjs f = ope ...
- NET项目&DLL反编译&MSSQL监控&VS搜索&注入&上传
知识点 1.NET普通源码&编译源码 2.DLL反编译&后缀文件&指向 3.代码审计-SQL注入&文件上传 ASPX文件 -> CS ASPX.CS DLL反编译 ...
- 文心一言 VS 讯飞星火 VS chatgpt (206)-- 算法导论15.4 3题
三.设计 LCS-LENGTH的带备忘的版本,运行时间为O(mn).需要写代码的时候,请用go语言. 文心一言,代码正常运行: LCS-LENGTH(Longest Common Subsequenc ...