环境:
QT5.6.3 linux 环境
在 QT 程序执行时,若想调用其外部的可执行文件。就可以使用 QProcess 类。使用很简单,手册中都有使用例子,但我在使用过程中,关于接管可执行程序中的打印输出功能,还是遇到一些问题,记录如下:
在嵌入式中,一般要执行的程序都会有打印输出的功能。当在 QT 中使用 QProcess 类去调用这个内部包含打印输出的程序后,就会接管其打印输出的信息。然后可以通过读取接管的信息,再搭配 textBrowser 这种控件,就可以做到在屏幕上显示输出的信息。
在这里,就会有两个问题:读取打印信息的时间和实时输出打印信息。
对于读取打印的时间,可以使用 readyReadStandardOutput 信号。根据手册描述,当标准输出有效时就会发射此信号。然后在接受的槽函数中使用 readAllStandardOutput 函数去读取信息即可。相关细节参考手册。
对于实时输出打印的时间,有两处需要满足。第一就是上述所述采用信号和槽函数的方式去实时的读取输出的打印信息。第二是要检查可执行程序中的输出语句有无缓存。若,在满足第一种的情况下发现执行完程序才会发出 readyReadStandardOutput 信号。那么大概率是你的可执行程序中打印有缓冲机制。
解决打印缓冲
如果可执行程序是 C++ ,使用 cout 输出 log 信息,那么可能是 cout 后面没加 endl ,导致不会立即输出。
如果可执行程序是 C, 使用 printf 输出 log 信息,那么可能是没加换行符。也有可能是 printf 输出缓存区不为NULL。在你要打印的最开始调用 setbuf(stdout, NULL) 就可以将输出缓冲区设置为NULL。或者在每条要执行打印后调用 fflush(stdout) 来刷新缓冲区。