C++ Qt开发:QProcess进程管理模块

简介: Qt是一个跨平台的C++图形库,简化了窗体应用开发,支持通过拖放组件提升效率。本章节关注`QProcess`组件,它用于控制和管理进程,例如执行命令、运行可执行文件及与外部进程通信。`QProcess`提供多种方法如`start`、`waitForStarted`和`waitForFinished`等,实现启动、监控和交互。示例展示了如何使用`QProcess`获取系统进程和信息,通过`tasklist`和`systeminfo`命令,并将结果展示在`QTreeWidget`中。

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::SeparateChannelsQProcess::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.");
    }
}

运行后当点击输出系统进程时则可以看到完整的进程输出效果,如下图所示;

image.png

使用此方法我们可以很好的读取到系统中的各种信息,只要能够合理的过滤出想要的字段即可,当需要输出系统信息时我们可以通过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运行时间较长所以需要等待一段时间,输出效果如下图所示;

image.png

目录
相关文章
|
25天前
|
开发框架 Linux C语言
C、C++、boost、Qt在嵌入式系统开发中的使用
C、C++、boost、Qt在嵌入式系统开发中的使用
31 1
|
存储 安全 算法
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
66 5
|
1月前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
67 0
|
2天前
|
开发框架 数据可视化 编译器
Qt的魅力:探索跨平台图形界面开发之旅
Qt的魅力:探索跨平台图形界面开发之旅
8 1
|
17天前
|
图形学 Python 容器
【PyQt5桌面应用开发】3.Qt Designer快速入门(控件详解)
【PyQt5桌面应用开发】3.Qt Designer快速入门(控件详解)
35 0
|
25天前
qt开发使用camera类获取摄像头信息并拍照保存
qt开发使用camera类获取摄像头信息并拍照保存
|
1月前
|
存储 Linux 程序员
【Linux C/C++ 堆内存分布】深入理解Linux进程的堆空间管理
【Linux C/C++ 堆内存分布】深入理解Linux进程的堆空间管理
76 0
|
1月前
|
存储 算法 程序员
【C/C++ 随机数】深入探索C++随机数生成,random 模块的应用
【C/C++ 随机数】深入探索C++随机数生成,random 模块的应用
66 0
|
1月前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
38 8
C++ Qt开发:QTcpSocket网络通信组件
|
1月前
|
存储 C++ 网络架构
C++ Qt开发:QUdpSocket实现组播通信
Qt教程:使用`QUdpSocket`实现UDP组播通信。通过设置套接字选项、绑定端口、加入和离开组播组,以及发送和接收数据报,简化跨平台窗体应用开发。关键函数包括`setSocketOption`设置多播TTL,`bind`绑定地址和端口,`joinMulticastGroup`加入组播,`leaveMulticastGroup`退出,`writeDatagram`发送,和`readDatagram`接收数据报。
26 1
C++ Qt开发:QUdpSocket实现组播通信

相关实验场景

更多

推荐镜像

更多