网站发布与推广计划,手机应用商店app下载,用wordpress做企业网站视频教程,想学做电商怎么加入Qt 是一个跨平台C图形界面开发库#xff0c;利用Qt可以快速开发跨平台窗体应用程序#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置#xff0c;实现图形化开发极大的方便了开发效率#xff0c;本章将重点介绍如何运用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运行时间较长所以需要等待一段时间输出效果如下图所示