Qt - 从 运行 进程获取输出
Qt - get output from running process
我想从 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 获取实时(变化的)输出并将其保存到字符串。
因为示例 "htop" 让我感兴趣,这里有一个提示。
htop 是一个 "interactive" 终端应用程序(使用 curses 来 "draw" 动画终端图像),而不是 运行-of-the-mill UNIX 风格的过滤器(从类似文件的源获取输入,并向任何类似文件的目标提供顺序输出流。
因此 "capture" 直播并不那么容易。事实上,唯一支持此功能的 class 应用程序称为 terminal emulator
。让我们使用 tmux
作为能够将 "screenshots" 写入文件的终端仿真器。
$ 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
获取那个window的内容:
$ 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 有一个很好的小部件来显示 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"
我想从 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 获取实时(变化的)输出并将其保存到字符串。
因为示例 "htop" 让我感兴趣,这里有一个提示。
htop 是一个 "interactive" 终端应用程序(使用 curses 来 "draw" 动画终端图像),而不是 运行-of-the-mill UNIX 风格的过滤器(从类似文件的源获取输入,并向任何类似文件的目标提供顺序输出流。
因此 "capture" 直播并不那么容易。事实上,唯一支持此功能的 class 应用程序称为 terminal emulator
。让我们使用 tmux
作为能够将 "screenshots" 写入文件的终端仿真器。
$ 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
获取那个window的内容:
$ 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 有一个很好的小部件来显示 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"