Как использовать qprocess для чтения вывода в реальном времени при запуске файла

Я новичок в qt. Было бы очень полезно, если бы эта проблема была решена. Я хотел бы использовать QProcess для выполнения файла и показать вывод в реальном времени в QTextviewer. Файл не может прекратить работу, пока вы не нажмете ctrl c в командной строке терминала. В противном случае файл хорошо работает на терминале в Linux. Основная проблема заключалась в следующем: процесс запустился с помощью qt, однако я не увидел никакого результата.

Я пробую сигнал (readyReadStandardOutput) и слот. Когда я добавляю waitforfinished(), графический интерфейс зависает.

if(!process)
{
    process = new QProcess (this);
}

process -> setWorkingDirectory("mydir");
connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(logRead()));
connect(process, SIGNAL(readyReadStandardError()), this, SLOT(readError()));
process -> start("./file");
process -> setProcessChannelMode(QProcess::MergedChannels);

if(false == peocess-> waitForStarted())
{
    ui -> textBrowser->append("the process cannot be called");
}else{
    ui -> textBrowser->append("the process can be called"); 
}

textBrowser показал, что «процесс можно вызвать».

void Dialog::logRead()
{
     QProcess *process = dynamic_cast<QProcess *>( sender() );

if (process){
  ui->textBrowser->append( p->readAllStandardOutput() );  
}

Я не знаю, почему я НЕ МОГУ выводить текст в режиме реального времени, даже я не получил никакого вывода! Любое предложение? Спасибо!


person Lanko Kuo    schedule 15.08.2019    source источник
comment
Не по теме, но... из QProcess::setProcessChannelMode: "This mode will be used the next time start() is called". Поэтому вызов setProcessChannelMode после start, вероятно, не даст желаемого эффекта.   -  person G.M.    schedule 15.08.2019


Ответы (1)


Ваша проблема должна быть в другой части вашего приложения. Мои минимальные воспроизводимые примеры работают, как и ожидалось.

#include <QApplication>
#include <QDebug>
#include <QTextBrowser>
#include <QProcess>

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    auto process = new QProcess;
    auto view = new QTextBrowser;
    process->setWorkingDirectory("C:/Temp");
    QObject::connect(process, &QProcess::readyReadStandardOutput, [process,view]() {
        auto output=process->readAllStandardOutput();
        view->append(output);
    });
    QObject::connect(process, &QProcess::readyReadStandardError, [process,view]() {
        auto output=process->readAllStandardError();
        view->append(output);
    });
    process->start("MyProgram.exe");
    process->setProcessChannelMode(QProcess::MergedChannels);

    process->waitForStarted();
    qDebug() << process->error();
    view->show();
    return a.exec();
}
person Aleph0    schedule 15.08.2019
comment
Спасибо. После того, как я попытаюсь снова, это сработает, но это не сообщение в реальном времени, оно будет иметь задержку около полуминуты. - person Lanko Kuo; 16.08.2019
comment
@LankoKuo: Возможно, ваша программа не сбрасывает вывод. Например, есть разница между std::cout << "Hello\n"; и std::cout << "Hello" << std::endl;. Это то, что вы можете проверить. - person Aleph0; 16.08.2019