Qt — получить вывод из запущенного процесса

Я хотел бы получить вывод от запущенного процесса на 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 и сохранить его в строку.

-2

Решение

Поскольку образец «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"
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]