QProcess怎么实时的读到output的信息

本文介绍了在Qt中使用QProcess进行子进程通信的过程及遇到的问题。作者尝试通过调用lftp.exe上传文件到服务器,并在过程中遇到信号未被触发的问题。通过调整命令参数,最终实现了通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Qt里想与子程序通信, 一般都会用到QProcess这个类, 而且手册里也提到了很多通信的方法, 比如手册里的 "Communicating via Channels". 我也不例外, 用的也是这货, 但在实际操作中, 还是遇到不少问题....

我的目的是:
    在主程序里调用"lftp.exe"来将一些文件上传到服务器上.

貌似很简单啊, 开工吧:
connect(&_process, SIGNAL(readyReadStandardOutput()), this, SLOT(onReadOutput()));
connect(&_process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(onFinished(int, QProcess::ExitStatus)));

QString cmd = QString("lftp -c 'open -e \"lcd d:/data; mirror -R ./ \" admin:admin@localhost'"); 
_process.start(cmd, QProcess::ReadWrite);

运行发现, onReadOutput()函数就是不调用, 这要不说明qt有BUG(-____-! 基本不可能), 要不就是我哪里写错了.
把命令换成 'ping localhost', 发现 onReadOutput()可以成功调用, 那应该就是一开始写的命令有问题.  把命令拷出来在命令行里执行, 发现是可以看到输出信息的, 然后大脑就断路了... 这是哪儿的问题啊.

调了很久, 注意到一个细节, 就是在命令行运行时, 输出的信息是一直在一行里的, 而没有换行, 也就是我们经常写的:
printf("hello world\r");

这会导致一直不换行, 而在进程间通信的时候, 是以\n来作为命令或缓冲区结束的标志的, 所以在我的程序中, 直到程序运行完毕, 也没有触发 readyReadStandardOutput信号.

知道了原因, 就得想解决办法来让主程序可以收到点什么, 好让用户认为上传过程还没死....

仔细看lftp的帮助后, 发现了-v这个参数...
-v这个参数是用来输出一些多余的信息的, 而打印多余的信息都是有\n结尾的...

所以最后就把命令改成了:
QString cmd = QString("lftp -c 'open -e \"lcd d:/data; mirror -veR ./ \" admin:admin@localhost'"); 

OK了, 程序可以接收到lftp发过来的输出了.
最后来张图纪念一下这个下午吧:
171624036939070.png





转载于:https://www.cnblogs.com/chaoswong/p/3605320.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值