QProcess

 

参考:https://blog.csdn.net/wzj0808/article/details/79367314

1、主程序:初始化及设定信号槽

    process = new QProcess();
 
    connect(process,SIGNAL(started()),SLOT(started()));
 
    connect(process,SIGNAL(finished(int,QProcess::ExitStatus)),SLOT(finished()));
 
    connect(process,SIGNAL(stateChanged(QProcess::ProcessState)),SLOT(stateChanged()));


2、主程序:启动process

//    QStringList list;
//    list.append("hello_1");
//    list.append("world_2");
//    list.append("ok_3");
    QStringList list;
    list<<"hello_1"<<"world_2"<<"ok_3";
 
    QString program = "E:\\hit-qt\\build-TestCallTo-Desktop_Qt_5_8_0_MinGW_32bit-Debug\\debug\\TestCallTo.exe";
 
    process->start(program,list);


3、主程序:注意start和startDetached的区别
 

  process->startDetached(QString("E:\\hit-qt\\build-TestCallTo-Desktop_Qt_5_8_0_MinGW_32bit-Debug\\debug\\TestCallTo.exe"),list);


start是一体式的:外部程序启动后,将随主程序的退出而退出;

startDetached是分离式的:外部程序启动后,不会随主程序的退出而退出。

重要区别:如果是start则回调都可以正常接收到信息;如果是startDetached则回调无法正常接收到信息
 

QProcess类用于启动外部程序并与之通信。

启动一个新进程的方式:把待启动的程序名称和启动参数传递给start()函数即可。

例如:

QProcess *parent;

QString program = “tar”;

QStringList arguments;

arguments << "czvf" << "backup.tar.gz" << "/home";

QProcess *myProcess = new QProcess(parent);

QProcess->start(program,arguments);

当调用start()函数后,myProcess进程立即进入启动状态,但tar程序尚未被调用,不能读写标准输入输出设备,当进程完成启动后就进入“运行状态”并向外发出started()信号。在输入输出方面,QProcess将一个进程看做一个流类型的I/O设备,可以像使用QTcpSocket读写流类型的网络连接一样来读写一个进程,可以通过QIODevice::write()函数向后所启动的标准输入写数据,也可以通过QIODevice::resd().QIODevice::readLine()和QIODevice::getChar()从这个进程的标准输出读数据。此外由于QProcess是从QIODevice类继承而来的,所以它也可以作为QXmlReader的数据在源,或者为QFtp产生上传数据。最后,当进程退出时QProcess进入起始状态--“非运行状态”,并发出finish()信号。

void finished(int exitCode, QProcess::ExitStatus exitStatus)先好在进程中返回了进程退出的退出码和退出状态,可以调取exitCode()函数和exitStatus()函数分别获取最后退出进程的这两个值。其中“退出状态”只有正常退出和进程崩溃两种,分别对应值QProcess::NormalExit(值0)和Qprocess::CrashExit(值1)。当进程在运行中产生错误时,QProcess将发出error()信号,可以通过,调用error()函数返回最后一次产生错误的类型,并通过state()找出此时进程所处的状态。Qt定义了如下的错误类型代码:

错误常量                        值      描述

QProcess::FailedToStart        0       进程启动失败

QProcess::Crashed              1       进程成功启动后崩溃

QProcess::Timedout             2       最后一次调用waitFor...()函数超时.此时QProcess状态不变,并可以再次调用waitFor()类型的函数

QProcess::WriteError           3       向进程写入时出错.如进程尚未启动,或者输入通道被关闭时

QProcess::ReadError            4       从进程中读取数据时出错.如进程尚未启动时

QProcess::UnknownError         5       未知错误.这也是error()函数返回的默认值

进程的标准输出

stdout:通常用于控制台下输出

stderr:通常用于进程打印错误

它们本质上是两个独立的数据流.

可以通过调用setReadChanned()函数设置当前的读通道

当有可读数据时Qt将发发出readyRead()信号

如果是标准输出和标准错误通道中读取数据,还会发出readyReadStandardOutput()信号

如果是标准错误也会发出readyReadStandardError()信号

readAllStandardOutput()函数从标准输出通道中读取数据

readAllStandardErrot()函数从标准错误通道中读取数据

在进程启动以前以MergedChannels参数调用setReadChannelMode()函数可以把标准输出通道和标准输错误通道合并

例:

#include <QApplication>

#include <QProcess>

#include <QString>

#include <iostream>

int main (int argc, char *argv[])

{

    QApplication app(argc, argv);

   QProcess proc;

    QStringList arguments;

    arguments << "-na";

    proc.start("netstat", arguments);

 

    // 等待进程启动

    if (!proc.waitForStarted())

    {

        std::cout << "启动失败\n";

        return false;

    }

    // 关闭写通道,因为没有向进程写数据,没用到 

    proc.closeWriteChannel();

 

    // 用于保存进程的控制台输出

    QByteArray procOutput;

    // 等待进程结束

    while (false == proc.waitForFinished())

    {

        ;

    }

    // 读取进程输出到控制台的数据

    procOutput = proc.readAll();

    // 输出读到的数据

    std::cout << procOutput.data() << std::endl;

    // 返回

    return EXIT_SUCCESS;

}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值