Я хотел бы получить вывод от запущенного процесса на Linux в Qt.
Мой код выглядит так:
#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 — это «интерактивное» терминальное приложение (использующее curses для «рисования» анимированного изображения терминала), в отличие от обычного фильтра в стиле UNIX (который принимает входные данные из файлового источника и предоставляет последовательный поток вывода к любому файлообразному месту назначения).
Так что не так просто «запечатлеть» это вживую. Фактически единственный класс приложений, который поддерживает это, называется terminal emulator
, Давайте использовать tmux
как эмулятор терминала, способный записывать «скриншоты» в файл.
$ SESS_ID=$(uuidgen)
$ COLUMNS=80 LINES=25 tmux new-session -s "$SESS_ID" -d htop
Это начинает новый сеанс, запуская htop в фоновом режиме. Мы сгенерировали уникальный идентификатор, чтобы мы могли контролировать его, не мешая другим сеансам 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 есть хороший виджет для отображения содержимого 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"
Других решений пока нет …