QProcess::setStandardOutputFile调用后如何重置输出回stdout
问题原因
QProcess的通道重定向配置是实例级持久生效的,调用setStandardOutputFile设置输出文件后,配置不会随单次进程运行结束自动清除,同实例后续启动的所有子进程都会沿用该重定向规则,因此test3的输出会被写入之前设置的文件。
实现方案
你可以选择以下任意一种方式实现需求:
- 方案1:同实例下主动重置配置
启动test3对应进程前,调用setStandardOutputFile传入空字符串,即可清除已设置的文件重定向规则,让输出恢复到默认stdout通道,参考代码:
QProcess* myProcess = new QProcess(); myProcess->start("echo test1"); myProcess->waitForFinished(); myProcess->setStandardOutputFile("my_file_path"); myProcess->start("echo test2"); myProcess->waitForFinished(); // 清空输出文件配置,重置为默认stdout输出 myProcess->setStandardOutputFile(QString()); myProcess->start("echo test3"); myProcess->waitForFinished();
提示:如果之前设置过标准错误输出文件
setStandardErrorFile,用同样方式传入空字符串即可同步重置错误输出通道。
- 方案2:不同输出目标使用独立QProcess实例
给需要写入文件的子进程单独创建QProcess实例,和负责控制台输出的实例完全隔离,从根源上避免配置残留,参考代码:
QProcess* consoleProcess = new QProcess(); consoleProcess->start("echo test1"); consoleProcess->waitForFinished(); // 单独创建文件输出专用的进程实例 QProcess* fileProcess = new QProcess(); fileProcess->setStandardOutputFile("my_file_path"); fileProcess->start("echo test2"); fileProcess->waitForFinished(); // 控制台输出实例未修改过重定向配置,直接启动即可输出到stdout consoleProcess->start("echo test3"); consoleProcess->waitForFinished();
- 两种方案都能实现预期效果:test1、test3输出到程序标准输出流,test2写入指定路径文件,不会出现输出错位。如果需要更灵活的输出分流,也可以绑定
readyReadStandardOutput信号,在槽函数中根据当前运行的进程类型,手动把读取到的输出内容写入对应目标。
内容的提问来源于stack exchange,提问作者PdxEngineer
相关产品推荐
相关产品推荐

