2016-12-12 7 views
-2

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

+0

Чтение документации загнутыми [это ] (http://doc.qt.io/qt-5/qprocess.html#readAllStandardOutput). Так что делать это в цикле, вероятно, вы получите там ... – StoryTeller

+0

Я тестировал его в отладчике Qt, но я не получаю никакого вывода. Вывод массива пуст. – tomsk

+0

Вы называли это более одного раза? Выполняющий процесс должен генерировать вывод для чтения, прежде чем вы сможете его прочитать. Это означает, что он должен быть запущен в первый раз – StoryTeller

ответ

3

Потому что образец «htop» меня интересует, вот подсказка.

htop - это «интерактивное» приложение терминала (с использованием проклятий для «рисования» анимированного изображения терминала), в отличие от стандартного фильтра 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 

На самом деле, запустить его несколько раз дает вам (монохромный) (каждые 2 секунды, по умолчанию):

$ watch tmux capture-pane -t "$SESS_ID" -p 

Теперь. Конечно, вы хотите цвета. Использовать ansifilter:

$ tmux capture-pane -t "$SESS_ID" -p -e | ansifilter -H > shot.html 

Voila. Я уверен, что у Qt есть хороший виджет для отображения содержимого 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" 
+0

Спасибо, что только способ генерировать html? – tomsk

+0

№. Единственный способ - использовать эмуляцию терминала и получить содержимое экрана оттуда. Я, случается, использовал tmux. Вам не нужно использовать HTML. Я просто выбрал это, потому что это было простое решение, чтобы получить экраны ANSI, переданные чему-то не-терминальному. Вы можете выбирать другие инструменты, это просто доказательство концепции. – sehe

+0

ОК спасибо большое :) – tomsk

Смежные вопросы