当前位置: 首页 > article >正文

详解Qt之QProcess 任务类

文章目录

  • QProcess 详解
    • 前言
    • 什么是 QProcess?
    • QProcess 的构造函数和常用成员函数
      • 构造函数
        • 1. 默认构造函数
    • 常用成员函数
      • 1. 启动进程
        • `start`
      • 2. 设置工作目录
        • `setWorkingDirectory`
      • 3. 设置环境变量
        • `setEnvironment`
      • 4. 获取输出
        • `readAllStandardOutput`
      • 5. 发送输入
        • `write`
      • 6. 等待操作
        • `waitForFinished`
      • 7. 获取退出状态
        • `exitCode`
      • 8. 信号槽
        • `finished`
    • 完整示例代码
    • 总结


QProcess 详解

前言

在现代软件开发中,程序经常需要调用外部命令或与其他进程进行交互。例如,在自动化测试中运行脚本,在应用程序中调用系统命令,或者在主进程与子进程之间交换数据。Qt 提供了一个功能强大的类——QProcess,用来处理这些任务。

QProcess 提供了跨平台的接口,支持启动外部程序、监控其状态,并与其进行标准输入、输出和错误流的通信。无论是简单地运行一个命令还是实现复杂的进程间通信,QProcess 都能胜任。


什么是 QProcess?

QProcess 是 Qt 的一个类,用于在应用程序中启动和管理外部进程。它支持以下主要功能:

  1. 启动进程:运行外部程序或脚本。
  2. 通信:与子进程的标准输入(stdin)、标准输出(stdout)和标准错误流(stderr)交互。
  3. 监控:获取子进程的状态信息,如启动、结束、退出代码等。
  4. 环境设置:配置子进程的环境变量和工作目录。

QProcess 的构造函数和常用成员函数

构造函数

1. 默认构造函数
  • 函数原型

    QProcess(QObject *parent = nullptr);
    
  • 作用
    创建一个未关联具体进程的 QProcess 对象。

  • 参数

    • parent:父对象,用于 Qt 的对象树管理,默认为空。
  • 示例代码

    QProcess process;
    

常用成员函数

1. 启动进程

start
  • 函数原型

    void start(const QString &program, const QStringList &arguments = QStringList(), QIODevice::OpenMode mode = ReadWrite);
    
  • 作用
    启动一个外部进程并与之交互。

  • 参数

    • program:要启动的程序路径或名称。
    • arguments:传递给程序的命令行参数。
    • mode:进程的输入输出模式(如 QIODevice::ReadWrite)。
  • 示例代码

    QProcess process;
    process.start("ping", QStringList() << "-c" << "4" << "www.google.com");
    

2. 设置工作目录

setWorkingDirectory
  • 函数原型

    void setWorkingDirectory(const QString &dir);
    
  • 作用
    设置子进程运行时的工作目录。

  • 参数

    • dir:工作目录的路径。
  • 示例代码

    QProcess process;
    process.setWorkingDirectory("/home/user/");
    process.start("ls", QStringList() << "-l");
    

3. 设置环境变量

setEnvironment
  • 函数原型

    void setEnvironment(const QStringList &environment);
    
  • 作用
    设置子进程的环境变量。

  • 参数

    • environment:环境变量的列表,每个环境变量以 KEY=VALUE 的形式表示。
  • 示例代码

    QProcess process;
    QStringList env = QProcess::systemEnvironment();
    env << "MY_VAR=123";
    process.setEnvironment(env);
    process.start("printenv");
    

4. 获取输出

readAllStandardOutput
  • 函数原型

    QByteArray readAllStandardOutput();
    
  • 作用
    读取子进程标准输出中的所有数据。

  • 返回值
    返回一个 QByteArray,包含标准输出中的数据。

  • 示例代码

    QProcess process;
    process.start("echo", QStringList() << "Hello, QProcess!");
    process.waitForFinished();
    qDebug() << "Output:" << process.readAllStandardOutput();
    

5. 发送输入

write
  • 函数原型

    qint64 write(const QByteArray &data);
    
  • 作用
    向子进程的标准输入中写入数据。

  • 参数

    • data:要写入的数据。
  • 返回值
    成功写入的字节数。

  • 示例代码

    QProcess process;
    process.start("cat");
    process.write("Hello, from QProcess!\n");
    process.closeWriteChannel();  // 通知子进程输入结束
    process.waitForFinished();
    qDebug() << process.readAllStandardOutput();
    

6. 等待操作

waitForFinished
  • 函数原型

    bool waitForFinished(int msecs = 30000);
    
  • 作用
    阻塞调用,等待子进程完成。

  • 参数

    • msecs:最大等待时间,单位为毫秒。
  • 返回值
    如果成功完成,返回 true;否则返回 false

  • 示例代码

    QProcess process;
    process.start("sleep", QStringList() << "3");
    if (process.waitForFinished()) {
        qDebug() << "Process finished successfully.";
    }
    

7. 获取退出状态

exitCode
  • 函数原型

    int exitCode() const;
    
  • 作用
    获取子进程的退出代码。

  • 返回值
    子进程的退出代码。

  • 示例代码

    QProcess process;
    process.start("false");  // 一个返回非零退出码的命令
    process.waitForFinished();
    qDebug() << "Exit code:" << process.exitCode();
    

8. 信号槽

finished
  • 函数原型

    void finished(int exitCode, QProcess::ExitStatus exitStatus);
    
  • 作用
    当子进程结束时发出信号。

  • 参数

    • exitCode:子进程的退出代码。
    • exitStatus:子进程的退出状态(正常退出或崩溃)。
  • 示例代码

    QProcess *process = new QProcess;
    QObject::connect(process, &QProcess::finished, [](int exitCode, QProcess::ExitStatus status) {
        qDebug() << "Process finished with exit code:" << exitCode << "and status:" << status;
    });
    process->start("ls", QStringList() << "-l");
    

完整示例代码

以下示例展示了如何使用 QProcess 启动外部程序、与其交互并获取输出:

#include <QCoreApplication>
#include <QProcess>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    // 创建 QProcess 对象
    QProcess process;

    // 设置工作目录
    process.setWorkingDirectory("/home/user/");

    // 设置环境变量
    QStringList env = QProcess::systemEnvironment();
    env << "MY_VAR=QtProcessExample";
    process.setEnvironment(env);

    // 启动外部程序
    process.start("echo", QStringList() << "Hello, QProcess!");

    // 等待完成
    if (!process.waitForFinished()) {
        qDebug() << "Process failed to finish.";
        return -1;
    }

    // 获取输出
    qDebug() << "Standard Output:" << process.readAllStandardOutput();
    qDebug() << "Exit Code:" << process.exitCode();

    return 0;
}

总结

QProcess 是一个强大且灵活的类,用于启动和管理外部进程。它封装了跨平台的进程管理能力,包括启动进程、与其交互和获取状态信息。通过支持环境设置、标准输入输出通信等功能,QProcess 在自动化测试、脚本执行、进程间通信等场景中非常有用。
熟练掌握 QProcess 的使用,可以帮助开发者实现更高效、更安全的进程管理。


http://www.kler.cn/a/408835.html

相关文章:

  • logback 初探学习
  • Gradio学习笔记记录
  • C语言蓝桥杯组题目
  • AIGC学习笔记(6)——AI大模型开发工程师
  • 【终端美化】Ubuntu 下 Zsh 与 Oh-My-Zsh 美化与插件配置指南
  • [论文阅读] 异常检测 Deep Learning for Anomaly Detection: A Review(三)总结梳理-疑点记录
  • Spring Boot3远程调用工具RestClient
  • SPA 首屏加载慢的原因及解决方案:结合实际项目的详细讲解
  • CVE-2022-4230
  • AWS云安全
  • 机器翻译基础与模型 之四:模型训练
  • 高新技术行业中的知识管理:关键性、挑战、策略及工具应用
  • Bug:gomonkey系列问题(undefined: buildJmpDirective)
  • 使用MQTTX连接新版ONENet
  • 实验室管理软件:Spring Boot技术构建
  • linux 查看端口占用 netstat, lsof, ss, fuser 笔记241123
  • 【Pytest+Yaml+Allure】实现接口自动化测试框架
  • 【深度学习】Pytorch 1.x 安装命令
  • openssl创建自签名证书
  • 从一个“支付状态不一致“的bug,看大型分布式系统的“隐藏杀机“
  • 数据集-目标检测系列- 牵牛花 检测数据集 morning_glory >> DataBall
  • HTTP 消息结构
  • 2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域
  • 香港服务器安装Debian12操作系统有python环境嘛
  • go 结构体指针
  • tcpdump抓包 wireShark