Qt5 解决 Windows 下 QProcess 无法接收到 readyRead() 信号的问题

系统环境:Windows 11, Qt 5.15.2, Mingw-w64 13.1.0

原本的代码:

  mProcess = new QProcess(this);
  mProcess->setProgram("wget.exe");
  mProcess->setArguments(
      {"xxxxx"});
  connect(mProcess, &QProcess::readyRead,
          [this] { qDebug().noquote() << mProcess->readAll(); });
  mProcess->start();
  mProcess->waitForReadyRead();
  mProcess->waitForFinished();

排查了半天,愣是发现不了哪里出问题……

一看 Qt Assistant,一段话突然引起了注意

翻译:Windows有意抑制从仅GUI应用程序到继承控制台的输出。这不适用于重定向到文件或管道的输出。然而,要在控制台上转发仅GUI应用程序的输出,您必须使用SeparateChannels,并通过读取输出并将其写入适当的输出通道来自己进行转发。

明摆着要改 processChannelMode,于是我向代码中添加了一行

 

mProcess->setProcessChannelMode(QProcess::SeparateChannels);

带着激动的心情编译、运行……还是不行?

想着硬碰硬,大不了把所有的 processChannelMode 全试一遍,结果发现设为 MergedChannels 就好了。

mProcess->setProcessChannelMode(QProcess::MergedChannels);

修改后的代码:

 

  mProcess = new QProcess(this);
  mProcess->setProgram("wget.exe");
  mProcess->setArguments(
      {"xxxxx"});
  mProcess->setProcessChannelMode(QProcess::MergedChannels);
  connect(mProcess, &QProcess::readyRead,
          [this] { qDebug().noquote() << mProcess->readAll(); });
  mProcess->start();
  mProcess->waitForReadyRead();
  mProcess->waitForFinished();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值