我需要从我的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()));
}
}
看看https://stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe将删除缓冲并导致你几乎立即得到输入(YMMV,我没有测试过这个)
您应该使用QProcess类。阅读有关通过渠道https://doc.qt.io/archives/qt-4.7/qprocess.html进行沟通的部分