Qt那些事0.0.26 之 QProcess通信

原创
2020/12/14 10:59
阅读数 669

最近完成了一个小软件,功能简单,浏览 以及 下载。

使用QT/QML做软件的界面,使用Python编写的脚本做下载器。最初的下载器原型就是用Python写好的,也曾想使用C++/QT按照原型架构重新下一遍,但是发现实现起来没有Python迅速,并且网页解析方面没有Py那么功能。弱类型语言就是真的快捷,一个简单的字典可以随意的在线程间穿来穿去,在C++中可能需要不断地继承继承继承。

双方按照想法实现了各自的功能,中间需要通讯。通讯方法很多,如缓存文件,如Socket,不过最终选择了QProcess通信。使用QProcess启动下载器是必须的步骤,既然可以通过此对象通信,就坚定的走下去。

约定

调用者:指定为QT程序,生成QProcess对象,并使用QProcess::start启动对应程序。

被调用者:指被 调用者启动的程序。

Qt实现

QProcess对象继承于QIODevice,就存在统一的ReadReady信号,告知调用者,被调用着有话跟你说,你通过绑定的槽接收一下。同时,因为QProcess的特殊性,还有多余的信号:标准输出信号()和标准错误信号。实际上存在发出信号的相应顺序,即使在前一个信号发出时,通过read获取了消息内容,后一个信号还是会发出,但是此时由 于消息被前一槽读出,此时读出的内容为空。

向被调用者写入消息直接调用write(QByteArray message)方法。但是要切记,此message要以'\n'结尾,否则被调用者不认为消息输出完成。

Python实现

Python可以通过标准输入或者通过input()函数获取调用者发送的消息。以下的代码很简单也很奏效。

import sys
message = sys.stdin.readall()

遇到的问题出在发送时。忘记了Python写入文件时需要适时的通过flush()函数将缓存内容写入文件。这里也同样适用。

import sys
message = sys.stdin.readall()
if message:
	sys.stdin.write("Got it")
	sys.stdin.flush()

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部