qt qprocess获取控制台输出(注意踩坑)

网上已经有很多教程了,这里再说一下:

//注意,mProcess为共享指针,要特别注意,信号和槽的连接要使用原始指针(也就是mProcess.get()函数)

std::shared_ptr<QProcess> mProcess;    
mProcess = std::make_shared<QProcess>();

mProcess->setProgram(cmd);
mProcess->setArguments(splitProcessCommand(arguments));
mProcess->setProcessChannelMode(QProcess::MergedChannels);   //设置读取标准输出模式 
mProcess->setProcessEnvironment(env);                        //设置环境变量
mProcess->setWorkingDirectory(workingDir);                   //这种工作目录


ok = connect(mProcess.get(), &QProcess::readyReadStandardError,[this](){ 
        this->log(QString::fromLocal8Bit( mProcess->readAllStandardError()));
    });
    
ok = connect(mProcess.get(), &QProcess::readyReadStandardOutput,[this](){
        //这样就实现把结果exe的信息给显示在控制台了
        this->log(QString::fromLocal8Bit( mProcess->readAllStandardOutput()));    
    });

mProcess->start();
mProcess->waitForStarted(5000);

//这里可以给它传入一些数据
mProcess->write(readFileToByteArray(mInputFile));
mProcess->closeWriteChannel();


//如果啥时候想终止这个进程,还可以用下面的代码
mProcess->closeReadChannel(QProcess::StandardOutput);
mProcess->closeReadChannel(QProcess::StandardError);
mProcess->closeWriteChannel();
mProcess->terminate();
mProcess->kill();



//这里面就能获得启动的exe的标准输出信息了
void DebugTarget::log(const QString &msg)
{
    emit debugTargetOutput(msg);
}

特别注意:

如果需要修改process的控制台窗口是否显示,则用下面的函数

mProcess->setCreateProcessArgumentsModifier([this](QProcess::CreateProcessArguments * args)
{   
        //下面这两行让后台exe弹出一个窗口         
        args->flags |=  CREATE_NEW_CONSOLE;            
        args->flags &= ~CREATE_NO_WINDOW;
}

切记:在这个函数里,下面这一行,千万不要用,否则qprocess关闭了标准输出,我们就获取不到输出了(我踩了这个巨坑,一天才找出来)
               args->startupInfo -> dwFlags &= ~STARTF_USESTDHANDLES;

当然,如果不通过信号与槽函数机制,自己主动去读取mProcee的标准输出也可以的,那就用

mProcee->readAll()

mProcee->write()

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值