经常会问这个问题。许多人建议使用readyReadStandardOutput
来实现此目的
什么是实现QProcess的最佳方式,即“实时”读取stdout和stderr?我想在DisplayEdit中添加消息。我的代码中必须更改的内容(您可以在下面看到)?可以使用QThread在DisplayEdit中写入吗?
我已经有以下代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QDebug>
#include <QCloseEvent>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
process = new QProcess(this);
connect(process, SIGNAL(readyReadStandardOutput()),SLOT(slotDataOnStdout()));
connect(process, SIGNAL(readyReadStandardError()), SLOT(slotProcessError()));
connect(process, SIGNAL(error(QProcess::ProcessError)),SLOT(slotProcessError()));
connect(process, SIGNAL(started()),SLOT(slotProcessStart()));
connect(process, SIGNAL(finished(int)),SLOT(slotProcessFinish(int)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_EnterButton_clicked()
{
QStringList args = ui->ArgsEdit->text().split(" ");
QString cmd = ui->CommandEdit->text();
process->start(cmd, args);
}
void MainWindow::slotDataOnStdout()
{
qDebug() << "slotDataOnStdout";
ui->DisplayEdit->append(process->readAllStandardOutput() + '\n');
}
void MainWindow::slotStderr()
{
qDebug() << "std error";
}
void MainWindow::slotProcessError()
{
qDebug() << "error";
}
void MainWindow::slotProcessStart()
{
qDebug() << "start";
}
void MainWindow::slotProcessFinish(int exitCode)
{
qDebug() << "finish: " << exitCode;
QString str = process->readAllStandardOutput();
qDebug() << str;
}
我想执行倒数计时器的二进制文件。我的计时器代码(我从clock reference获取了它:
#include <stdio.h>
#include <time.h>
void wait ( int seconds )
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
}
int main ()
{
int n;
printf ("Starting countdown...\n");
for (n=10; n>0; n--)
{
printf ("%d\n",n);
wait (1);
}
printf ("FIRE!!!\n");
return 0;
}
答案 0 :(得分:1)
看起来大概是对的。您确实忘记了清理流程,或者考虑在流程尚未完成时该怎么做。
对于计时器,请使用QTimer::timeout
信号。