Мне нужно вызвать исполняемый файл из моего приложения QT, проследить за выводом, а затем отобразить вывод в текстовом браузере.
Исполняемый файл, который я вызываю из моего приложения QT, будет работать в течение многих часов (~12) и каждый раз, когда исполняемый файл выплевывает что-то на стандартный вывод, мне нужно проанализировать вывод, чтобы иметь возможность отслеживать его ход, а затем отобразить все это на экране.
Я сделал это ниже, чтобы начать ...который является началом ... Но он отображает вывод в окно только после завершения исполняемого файла, и мне нужно, чтобы он обновлялся в режиме реального времени ... а также анализирует вывод
Вставьте новый код... Программа запускается, но ничего не переносится на экран, может быть, мне нужно настроить процесс записи в стандартный вывод?Он будет отображать каждый вывод, когда программа отменяется или заканчивается ... Вся функция действует таким образом?Конечно, я делаю что-то глупое ...
кстати исполняемый файл, который я вызываю, не буферизует вывод ... при вызове из командной строки он выводит при запуске программы ... Запускает все, кроме завершенного бита SIGNAL...
Новый код: (РЕДАКТИРОВАТЬ ... Решение!)
monit::monit(QWidget *parent) :
QDialog(parent),
ui(new Ui::monit){
ui->setupUi(this);
r = new QProcess(this);
connect(r, SIGNAL(readyReadStandardError()), this, SLOT(updateError()));
connect(r, SIGNAL(readyReadStandardOutput()), this, SLOT(updateText()));
//connect(r, SIGNAL(started()), this, SLOT(updateExit()));
}
ProcChainMonitor::~ProcChainMonitor()
{
delete ui;
}
void ProcChainMonitor::on_buttonStart_clicked()
{
QString program = "prog";
QStringList arguments;
arguments << "arg";
r->setWorkingDirectory("dir");
r->start(program, arguments);
}
void ProcChainMonitor::updateError()
{
QByteArray data = r->readAllStandardError();
ui->textEdit->append(data);
if (r->exitStatus()!= NULL){
ui->textEdit->append("Exited");
ui->textEdit->append(QString::number(r->exitCode()));
}
}
void ProcChainMonitor::updateText()
{
QByteArray data = r->readAll();
ui->textEdit->append(data);
if (r->exitStatus()!= NULL){
ui->textEdit->append("Exited");
ui->textEdit->append(QString::number(r->exitCode()));
}
}