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


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

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

    1. std::shared_ptr mProcess;
    2. mProcess = std::make_shared();
    3. mProcess->setProgram(cmd);
    4. mProcess->setArguments(splitProcessCommand(arguments));
    5. mProcess->setProcessChannelMode(QProcess::MergedChannels); //设置读取标准输出模式
    6. mProcess->setProcessEnvironment(env); //设置环境变量
    7. mProcess->setWorkingDirectory(workingDir); //这种工作目录
    8. ok = connect(mProcess.get(), &QProcess::readyReadStandardError,[this](){
    9. this->log(QString::fromLocal8Bit( mProcess->readAllStandardError()));
    10. });
    11. ok = connect(mProcess.get(), &QProcess::readyReadStandardOutput,[this](){
    12. //这样就实现把结果exe的信息给显示在控制台了
    13. this->log(QString::fromLocal8Bit( mProcess->readAllStandardOutput()));
    14. });
    15. mProcess->start();
    16. mProcess->waitForStarted(5000);
    17. //这里可以给它传入一些数据
    18. mProcess->write(readFileToByteArray(mInputFile));
    19. mProcess->closeWriteChannel();
    20. //如果啥时候想终止这个进程,还可以用下面的代码
    21. mProcess->closeReadChannel(QProcess::StandardOutput);
    22. mProcess->closeReadChannel(QProcess::StandardError);
    23. mProcess->closeWriteChannel();
    24. mProcess->terminate();
    25. mProcess->kill();
    26. //这里面就能获得启动的exe的标准输出信息了
    27. void DebugTarget::log(const QString &msg)
    28. {
    29. emit debugTargetOutput(msg);
    30. }

    特别注意:

    如果需要修改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()

  • 相关阅读:
    无法上网问题解决过程
    【Python基础篇017】6000字带你初识面向对象
    Java学习笔记 --- 枚举类
    sql优化及索引失效
    数据结构与算法课程设计:基于交通路线的规划系统
    当OpenHarmony遇上OpenEuler
    国内最火热的低代码平台推荐--万界星空科技低代码平台
    Word控件Aspose.Words for .NET.更新至最新v22.6,更多功能增强及漏洞修复
    29.STM32红外遥控器
    【MyBatis笔记05】MyBatis中常见的几种查询结果类型介绍
  • 原文地址:https://blog.csdn.net/kangkanglhb88008/article/details/126449892