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的附件上传功能 ...
随机推荐
- NC223888 红色和紫色.md
题目链接 题目 题目描述 漫长的生命总是无聊的.这天,小红和紫准备玩一个染色游戏. 她们拿出了一个有 \(n*m\) 个格子的网格,每个格子只能被染成红色或紫色.每个人可以任意选择一个格子染成红色和紫 ...
- Java集合框架学习(六) LinkedList详解
LinkedList介绍 ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只是实现的方式有所不同. LinkedList是采用链表的方式来实现 ...
- windows 程序启动后挂到后台
开发中遇到一个问题,程序启动后,并没有出现在前台,而是自动挂到后台,程序处于卡死状态,基本任何模块都没加载进来. 后面排查发现跟一个功能的第三方 dll 有关系,在那个 dll 加载时导致程序卡死,因 ...
- UtilMeta - 简洁高效的 Python 后端元框架
最近开源了我开发多年的一个 Python 后端框架:UtilMeta 项目介绍 UtilMeta 是一个用于开发 API 服务的后端元框架,基于 Python 类型注解标准高效构建声明式接口与 ORM ...
- gorm入门学习
文档 https://learnku.com/docs/gorm/v2/v2_release_note/9756 https://gorm.cn/zh_CN/docs/ 下载安装 go get -u ...
- React 中 Ref 引用
不要因为别人的评价而改变自己的想法,因为你的生活是你自己的. 1. React 中 Ref 的应用 1.1 给标签设置 ref 给标签设置 ref,ref="username", ...
- Oracle触发器联合唯一约束
Oracle支持可为空字端的唯一约束呢?下面就是用触发器作出的限制语句,仅供参考: CREATE OR REPLACE TRIGGER Tg_Completion_Test BEFORE INSERT ...
- [C++] epoll编写的echo服务端
直接贴代码,代码是运行在Linux上面的,通过 g++ epoll.cpp编译 #include <sys/socket.h> #include <sys/epoll.h> # ...
- ui转py文件
ui文件转py文件并且使用 简单做一个笔记,以后忘了回来看看 转换 在QT Designer中创建完ui文件后,回到pycharm中,右键点击ui文件,选择pyuic 完成后获得了和ui文件同名的py ...
- 开源.NET8.0小项目伪微服务框架(分布式、EFCore、Redis、RabbitMQ、Mysql等)
1.前言 为什么说是伪微服务框架,常见微服务框架可能还包括服务容错.服务间的通信.服务追踪和监控.服务注册和发现等等,而我这里为了在使用中的更简单,将很多东西进行了简化或者省略了. 年前到现在在开发一 ...