我无法在Qt中更新stdout

问题描述 投票:0回答:2

我需要从我的QT应用程序调用可执行文件,监视输出,然后在文本浏览器中显示输出。

我从QT应用程序调用的可执行文件将运行数小时(~12),每次可执行文件向stdout吐出内容时,我需要解析输出以便能够监视其进度,然后将其全部显示到屏幕上。

我在下面做了这个开始...这是一个开始...但它只在可执行文件完成时显示输出到窗口,我需要它实时更新...以及解析输出

将新代码放入...程序运行,但没有任何内容移植到屏幕上,也许我需要设置进程写入stdout?程序取消或完成后,它将显示每个输出...整个功能是这样的吗?当然,我在做一些愚蠢的事......

顺便说一下我调用的可执行文件不缓冲输出...当从命令行调用时,它会在程序运行时输出...运行除了完成的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()));
}

}
c++ linux qt4
2个回答
0
投票

看看https://stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe将删除缓冲并导致你几乎立即得到输入(YMMV,我没有测试过这个)


2
投票

您应该使用QProcess类。阅读有关通过渠道https://doc.qt.io/archives/qt-4.7/qprocess.html进行沟通的部分

© www.soinside.com 2019 - 2024. All rights reserved.