最近完成了一个小软件,功能简单,浏览 以及 下载。
使用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()