我想在Qt。中获取Linux上运行进程的输出。
我的代码如下所示:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qprocess.h>
#include <qthread.h>
QProcess process;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
process.start("htop");
connect(&process, SIGNAL(readyReadStandardOutput()), this, SLOT(getData()));
}
void getData(){
QByteArray out;
out = process.readAllStandardOutput();
}
MainWindow::~MainWindow()
{
delete ui;
}
但我希望从 htop 获得实时(更改)输出并将其保存为字符串。
答案 0 :(得分:3)
因为样本“htop”让我感兴趣,所以这里有一个提示。
htop是一个“交互式”终端应用程序(使用curses“绘制”动画终端图像),而不是一般的UNIX样式过滤器(从类文件源获取输入,并为任何类似文件的目的地提供顺序输出流。
所以现在“捕捉”它并不容易。实际上,支持此功能的唯一应用程序类称为terminal emulator
。让我们使用tmux
作为能够将“屏幕截图”写入文件的终端模拟器。
$ SESS_ID=$(uuidgen)
$ COLUMNS=80 LINES=25 tmux new-session -s "$SESS_ID" -d htop
这会启动一个新会话,在后台运行htop。我们生成了一个唯一的ID,因此我们可以控制它而不会干扰其他tmux会话。您可以列出它以检查名称:
$ tmux list-sessions
a9946cbf-9863-4ac1-a063-02724e580f88: 1 windows (created Wed Dec 14 21:10:42 2016) [170x42]
现在您可以使用capture-pane
来获取该窗口的内容:
$ tmux capture-pane -t "$SESS_ID" -p
事实上,反复运行会为你提供htop的(单色)实时镜像(默认情况下每2秒):
$ watch tmux capture-pane -t "$SESS_ID" -p
现在。当然,你想要颜色。使用ansifilter
:
$ tmux capture-pane -t "$SESS_ID" -p -e | ansifilter -H > shot.html
瞧。我确定Qt有一个很好的Widget来显示HTML内容。我测试了它运行这个
$ while sleep 1; do tmux capture-pane -t "$SESS_ID" -p -e | ansifilter -H > shot.html; done
在我的浏览器中打开shot.html
。每次重新加载时,我都会获得最新的截图:
哦,PS,当你使用
完成该会话的清理时$ tmux kill-session -t "$SESS_ID"