Qt - 从正在运行的进程

时间:2016-12-12 13:26:19

标签: c++ qt screen-capture terminal-emulator

我想在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 获得实时(更改)输出并将其保存为字符串。

1 个答案:

答案 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。每次重新加载时,我都会获得最新的截图:

enter image description here

哦,PS,当你使用

完成该会话的清理时
$ tmux kill-session -t "$SESS_ID"