设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间22 现在时间22 缓存数据 关关难过关关过,夜夜难熬夜夜熬。万般皆苦,悲欢自渡,他人难悟。晚安!

关关难过关关过,夜夜难熬夜夜熬。万般皆苦,悲欢自渡,他人难悟。晚安!

查看: 1197|回复: 4

C++ Qt开发之使用QProcess实现进程管理

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
52
主题
40
精华
0
金钱
142
积分
92
注册时间
2023-9-30
最后登录
2025-9-8

发表于 2024-4-13 18:53:37 | 显示全部楼层 |阅读模式
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用
  1. QProcess
复制代码
组件实现针对进程的控制管理等。
当你在使用Qt进行跨平台应用程序开发时,经常需要与外部进程进行交互,这时就可以利用Qt的
  1. QProcess
复制代码
模块。
  1. QProcess
复制代码
模块提供了启动和控制外部进程的功能,能够执行外部命令、运行其他可执行文件,以及与外部进程进行通信。通过
  1. QProcess
复制代码
,可以方便地执行命令行命令、调用系统工具、执行脚本等。
  1. QProcess
复制代码
还可以捕获外部进程的输出,以及监视外部进程的运行状态,从而实现更灵活、高效的进程管理。
以下是
  1. 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。这些函数提供了控制进程的各种方法,可以实现启动、监视、控制和与外部进程进行交互的功能。
进程控制模块可以实现对特定进程的启动关闭,本章将以执行命令行为例,通过调用
  1. Start()
复制代码
可以拉起一个第三方进程。
  1. QProcess
复制代码
类的
  1. start()
复制代码
函数有几种不同的重载形式,但最常用的是以下形式:
  1. bool QProcess::start(
  2.     const QString &program,
  3.     const QStringList &arguments,
  4.     QIODevice::OpenMode mode = ReadWrite
  5. )
复制代码
函数用于启动一个新的进程,并执行指定的程序(
  1. program
复制代码
参数)。
  1. arguments
复制代码
参数指定了传递给程序的参数列表,它是一个
  1. QStringList
复制代码
类型的参数,可以为空。
  1. mode
复制代码
参数指定了启动进程时打开的模式,默认为
  1. ReadWrite
复制代码
。函数返回一个
  1. bool
复制代码
类型的值,表示进程是否成功启动。
当调用
  1. start()
复制代码
执行命令后,我们则可以通过
  1. readAllStandardOutput()
复制代码
函数从进程的标准输出中读取所有可用的数据,并将其返回为
  1. QByteArray
复制代码
对象。
  1. QByteArray QProcess::readAllStandardOutput()
复制代码
这个函数没有参数,它会立即返回当前可用的标准输出数据,并将输出数据作为字节数组返回。如果没有可用的输出数据,它将返回一个空的字节数组。
当然了,与之对应的
  1. readAllStandardError()
复制代码
是函数,该函数可以用于从进程的标准错误输出中读取所有可用的数据,并将其返回为
  1. QByteArray
复制代码
对象。
  1. QByteArray QProcess::readAllStandardError()
复制代码
该函数同样没有参数,它会立即返回当前可用的标准错误输出数据,并将输出数据作为字节数组返回。如果没有可用的错误输出数据,它将返回一个空的字节数组。
获取进程信息
此处我们以输出系统进程信息为例,通常可以调用
  1. tasklist /FO CSV
复制代码
来获取系统中的进程列表,并将其输出为
  1. CSV
复制代码
格式,通过调用如下函数则可以获取到系统进程信息。
  1. process.start("tasklist", QStringList() << "/FO" << "CSV");
复制代码
此时通过调用
  1. readAllStandardOutput
复制代码
函数我们可以将缓冲区内的数据读出并将其放入到一个
  1. QString
复制代码
类型变量内;
  1. QString output = process.readAllStandardOutput();
复制代码
当具备了这个列表后,就可以根据冒号来逐行读入并切割,通过循环的方式将其追加到
  1. treeWidget
复制代码
组件内,并以此来实现展示的效果;
  1. 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.");    }}
复制代码
运行后当点击输出系统进程时则可以看到完整的进程输出效果,如下图所示;
1.png

使用此方法我们可以很好的读取到系统中的各种信息,只要能够合理的过滤出想要的字段即可,当需要输出系统信息时我们可以通过
  1. process.start("systeminfo")
复制代码
调用系统命令获取到,如下代码所示;
  1. void MainWindow::on_pushButton_2_clicked()
  2. {
  3.     ui->treeWidget->clear();

  4.     // 获取系统信息
  5.     QProcess process;
  6.     process.start("systeminfo");

  7.     if (process.waitForFinished())
  8.     {
  9.      QByteArray output = process.readAllStandardOutput();

  10.      // 使用正确的文本编码对输出进行解码
  11.      QTextCodec *codec = QTextCodec::codecForName("GBK");
  12.      QString text = codec->toUnicode(output);

  13.      QStringList lines = text.split("\n");
  14.      for (const QString &line : lines)
  15.      {
  16.          // 解析系统信息,添加到 QTreeWidget 中
  17.          QStringList fields = line.split(":", Qt::SkipEmptyParts);
  18.          if (fields.size() >= 2)
  19.          {
  20.              QString property = fields[0].trimmed();
  21.              QString value = fields[1].trimmed();

  22.              QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
  23.              item->setText(0, property);
  24.              item->setText(1, value);
  25.          }
  26.      }

  27.      // 设置列标题
  28.      ui->treeWidget->setHeaderLabels(QStringList() << "系统信息" << "数值");
  29.     } else
  30.     {
  31.      QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
  32.      item->setText(0, "Failed to execute systeminfo command.");
  33.     }
  34. }
复制代码
运行后当用户点击输出系统信息按钮时,因
  1. systeminfo
复制代码
运行时间较长所以需要等待一段时间,输出效果如下图所示;
2.png

到此这篇关于C++ Qt开发之使用QProcess实现进程管理的文章就介绍到这了,更多相关Qt QProcess进程管理内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 打卡月天数:0
  • 打卡总奖励:41
  • 最近打卡:2025-02-12 04:49:16
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
57
积分
12
注册时间
2023-4-29
最后登录
2025-2-12

发表于 2024-4-14 01:41:15 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-25
最后登录
2022-12-25

发表于 2024-9-20 13:37:17 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-26
最后登录
2022-12-26

发表于 2024-9-21 08:12:27 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-28
最后登录
2022-12-28

发表于 6 天前 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表