• QProcess快速实现外部程序调用


    QProcess快速实现外部程序调用

    https://zhuanlan.zhihu.com/p/110544668

    1.QProcess类及接口介绍

    QProcess类是Qt中专门用于启动一个外部程序进程并与主程序通信的。此类中包含多个静态函数和信号,可以方便地通过信号与槽机制实现信息互通。

    我们要实现快速调用外部程序,常用的有三个接口函数:

    1. QProcess::execute(): 此函数是以阻塞的方式打开外部程序,只有外部程序执行完成后,主程序才会继续执行。外部程序的标准输出、标准错误都是重定向到主程序的标准输出和标准错误的。
    2. QProcess::start(): 此函数是以子进程的 方式打开外部程序的,外部进程与主程序互不干扰,但外部进程的父进程就是主程序。
    3. QProcess::startDetached(): 此函数是以分离的方式打开外部程序的,外部程序与主程序互不干扰,外部进程的父进程是系统的init进程。

    上面三个接口函数中,execute()startDetached()为静态成员函数,start()函数为普通成员函数。 另外,值得注意的是,使用start() 函数打开外部进程时,外部进程启动后,将随主程序的退出而退出,使用回调即可以正常接收信息;使用startDetached() 函数打开外部进程时,外部进程启动后,不会随主程序的退出而退出,使用回调无法正常接收到信息。

    2. 打开外部程序的应用示例

    对于日常工作中,想在某项工作执行完成后,执行关机操作。这就可以使用主程序调用操作系统中的Shutdown.exe进程。 这里先介绍一下Shutdown.exe相关的操作指令参数,在系统命令行中可以直接运行此进程并查看相关参数。

    例如,我们要执行一小时后关机命令,可以写如下代码:

    QStringList  list;  
    list<< "-t" << "-s" << "3600";  
    QProcess::startDetached("Shutdown.exe",list);   
    // QProcess::execute("Shutdown.exe",list);  
    

    我们可以创建QProcess对象,使用start()函数,查看外部进程返回的数据,输出结果。其代码可以写成如下形式:

    QProcess *pProces = new QProcess(this);  
    connect(pProces, SIGNAL(readyRead()),this, SLOT(on_read()));  
    QStringList list;  
    pProces->start("Shutdown.exe", list);  
      
    void on_read()  
    {  
      QProcess *pProces = (QProcess *)sender();  
      QString result = pProces->readAll();  
      QMessageBox::warning(NULL, "", result);  
    }  
    

    也可以单独执行程序,如routeipconfig等。

    QProcess p(0);  
    p.start("route");  
    p.waitForStarted();  
    p.waitForFinished();  
    qDebug()<<QString::fromLocal8Bit(p.readAllStandardError());  
    
    QProcess p(0);  
    p.start("ipconfig");  
    p.waitForStarted();  
    p.waitForFinished();  
    qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput()); 
    

    也可以借助write()函数向外部进程中写入相应的参数,示例如下:

    QProcess p(0);  
    p.start("cmd");  
    p.waitForStarted();  
    p.write("dir
    ");  
    p.closeWriteChannel();  
    p.waitForFinished();  
    qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput()); 
    
    //或者是这一种形式
    QProcess p(0);  
    p.start("cmd", QStringList()<<"/c"<<"dir");  
    p.waitForStarted();  
    p.waitForFinished();  
    qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());  
    

    我们也可以通过QProcess使用管道的功能,即一个进程的标准输出流到目标进程的标准输入流:command1 | command2。其代码如下示例:

    QProcess process1;  
    QProcess process2;  
    process1.setStandardOutputProcess(&process2);  //注意设置
    process1.start("command1");  
    process2.start("command2");
    

    在项目开发过程中,要根据需求场景灵活选择适宜的接口函数,以达到满意的效果。

     

    ==================== End

  • 相关阅读:
    Spring Boot中使用AOP统一处理Web请求日志
    Spring事务处理时自我调用
    Spring事务管理接口定义
    数据库事务与MySQL事务总结
    事务与分布式事务
    什么是CSV
    jmeter配置原件之使用CSV Data Set Config参数化
    jmeter之断言、数据提取器(正则表达式、jsonpath、beanshell)、聚合报告、参数化
    Jmeter关联,正则表达式提取器使用
    CentOS7 安装RabbitMQ
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/12641707.html
Copyright © 2020-2023  润新知