Отображение вывода QProcess в реальном времени в текстовом браузере

Я новичок в разработке qt, и я хочу передать вывод QProcess в текстовый браузер в режиме реального времени. Я начал с выполнения простой команды эха, но вывод программы не отображается. Что я делаю неправильно????

QProcess p;
p.start("echo hye");
QByteArray byteArray = p.readAllStandardOutput();
    QStringList strLines = QString(byteArray).split("\n");
    QString line= p.readAllStandardOutput();
    if(p.state()==QProcess::NotRunning)
        ui->textBrowser->append("not running");
    foreach (QString line, strLines){
    ui->textBrowser->append(line);}

P.S. Я на Linux-машине.

РЕДАКТИРОВАТЬ: я все еще не могу получить вывод в textBrowser .

Я изменил параметры Qprocess и попробовал как waitForStarted(), так и waitForReadyRead(), чтобы процесс запускался вовремя и были доступны результаты.

Я добавил функцию waitForFinished(), чтобы процесс не завершался, когда он выходит за пределы области видимости.

QProcess p;
    p.start("echo", QStringList() << "hye");
    p.waitForStarted();
    QByteArray byteArray = p.readAllStandardOutput();
    QStringList strLines = QString(byteArray).split("\n");
    QString line= p.readAllStandardOutput();
    if(p.state()==QProcess::NotRunning)
        ui->textBrowser->append("not running");
    ui->textBrowser->append(line);
    p.waitForFinished();

person Tanmay J Shetty    schedule 11.04.2012    source источник


Ответы (1)


чтобы прочитать стандартный вывод, вам нужно либо вызвать waitForReadyRead() перед чтением вывода stardard, либо вам нужно подключить сигнал Qprocess readyReadStandardOutput() к вашему слоту и прочитать стандартный вывод из слота.

также убедитесь, что ваш QProcess не находится в стеке.

Я попробовал следующий код, работает нормально.

РЕДАКТИРОВАТЬ:

MyProcess::MyProcess(QObject *parent) :
    QObject(parent)
{
    QString program = "echo";
    QStringList arguments;
    arguments << "Hello";
    mProcess.start(program,arguments);
    connect(&mProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(readyReadStandardOutput()));
    connect(&mProcess,SIGNAL(readyReadStandardError()),this,SLOT(readyReadStandardError()));
}

void MyProcess::readyReadStandardOutput(){
    qDebug()<< mProcess.readAllStandardOutput();
}

void MyProcess::readyReadStandardError(){
    qDebug() << mProcess.readAllStandardError();
}
person Kunal    schedule 11.04.2012
comment
Я хотел бы отобразить результаты в текстовом браузере, но этот код отображает результаты в самом терминале qt. - person Tanmay J Shetty; 12.04.2012
comment
ну, вы можете использовать ui-›textBrowser-›append вместо qDebug() - person Kunal; 12.04.2012
comment
См. sites.google.com. /site/marcsturmspages/qt/, чтобы узнать о проблеме с буферизацией и ее обходном пути. - person Answeror; 21.06.2013
comment
Спасибо за напоминание о waitForReadyRead()! Для моего приложения этого было достаточно, и использование этого не требует подкласса от QProcess. - person Valentin Heinitz; 02.08.2015