Qt - 如何将 QProcess 的标准输出重定向到 TextEdit
Qt - How to redirect QProcess' stdout to TextEdit
我正在尝试打印使用 [=13=] 下载网站的过程输出
在小部件 (textEdit) 中,但它不打印任何内容,但在终端中它有效。
示例
命令:
wget --no-clobber --convert-links --random-wait -r -p -E -e robots=off -U mozilla http://site/path`
输出:
Resolving ******... 54.239.26.173
Connecting to *****|54.239.26.173|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘/index.html’
...
我的代码:
void downloadWebsite::on_pushButton_clicked()
{
input = ui->lineEdit->text();
if(input.isEmpty())
QMessageBox::information(this,"Error","Not an url / webpage !");
else{
QProcess *getDownload = new QProcess(this);
getDownload->setProcessChannelMode(QProcess::MergedChannels); //it prints everything , even errors
QString command = "wget --no-clobber --convert-links --random-wait -r -p -E -e robots=off -U mozilla " + input;
getDownload->start("sh",QStringList() << "-c" <<"cd ;"+command);
QByteArray outputLog = getDownload->readAllStandardOutput();
getDownload->waitForFinished();
getDownload->close();
QString outputToString(outputLog);
ui->textEdit->setText(outputToString);
}
}
我做错了什么?
谢谢。
连接到信号 readyReadStandardOutput。更像这样的东西(但未经测试):
connect(getDownload, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));
当然应该在开始之前调用connect。和信号处理程序:
void downloadWebsite::readOutput(){
while(getDownload->canReadLine()){
ui->textEdit->setText(getDownload->readLine());
}
// somebuffer.append(getDownload->readAllStandardOutput());
}
如您所见,还应调用 canReadLine
,因此 getDownload 必须可用。
我找到了一些解决方案。 (我是 Qt 的新手,但希望它能有所帮助):
mainwindow.h
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
signals:
void proccessFinished(int exitCode, QProcess::ExitStatus status);
public slots:
void runCommand();
void readCommand();
void stopCommand(int exitCode, QProcess::ExitStatus exitStatus);
//private or public?
private slots:
void error(QProcess::ProcessError error);
void stateChanged(QProcess::ProcessState state);
private:
Ui::MainWindow *ui;
QProcess *cmd;
};
mainwindow.cpp
include "mainwindow.h"
include "ui_mainwindow.h"
include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
cmd = new QProcess(this);
cmd->setProcessChannelMode(QProcess::MergedChannels);
//button click
connect(ui->btnRun, SIGNAL (clicked()), this, SLOT (runCommand()));
// process has some data to read
connect(cmd, SIGNAL (readyRead()), this, SLOT (readCommand()));
//process finished
connect(cmd, SIGNAL (finished(int, QProcess::ExitStatus)), this, SLOT (stopCommand(int, QProcess::ExitStatus)));
}
MainWindow::~MainWindow()
{
delete ui;
cmd->close(); //? how to do it right?
delete cmd;
}
void MainWindow::runCommand()
{
ui->output->append("Run process...");
cmd->start("ping -n 15 google.com");
// ??? the best way to continue here???
}
void MainWindow::readCommand(){
ui->output->append(cmd->readAll()); //output is QTextBrowser
}
void MainWindow::stopCommand(int exitCode, QProcess::ExitStatus exitStatus){
ui->output->append(cmd->readAll());
ui->output->append("cmd finished");
ui->output->append(QString::number(exitCode));
}
void MainWindow::error(QProcess::ProcessError error)
{
qDebug() <<"Error" << error;
}
void MainWindow::stateChanged(QProcess::ProcessState state)
{
qDebug() << "Process::stateChanged" << state;
}
我正在尝试打印使用 [=13=] 下载网站的过程输出 在小部件 (textEdit) 中,但它不打印任何内容,但在终端中它有效。
示例
命令:
wget --no-clobber --convert-links --random-wait -r -p -E -e robots=off -U mozilla http://site/path`
输出:
Resolving ******... 54.239.26.173
Connecting to *****|54.239.26.173|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘/index.html’
...
我的代码:
void downloadWebsite::on_pushButton_clicked()
{
input = ui->lineEdit->text();
if(input.isEmpty())
QMessageBox::information(this,"Error","Not an url / webpage !");
else{
QProcess *getDownload = new QProcess(this);
getDownload->setProcessChannelMode(QProcess::MergedChannels); //it prints everything , even errors
QString command = "wget --no-clobber --convert-links --random-wait -r -p -E -e robots=off -U mozilla " + input;
getDownload->start("sh",QStringList() << "-c" <<"cd ;"+command);
QByteArray outputLog = getDownload->readAllStandardOutput();
getDownload->waitForFinished();
getDownload->close();
QString outputToString(outputLog);
ui->textEdit->setText(outputToString);
}
}
我做错了什么?
谢谢。
连接到信号 readyReadStandardOutput。更像这样的东西(但未经测试):
connect(getDownload, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));
当然应该在开始之前调用connect。和信号处理程序:
void downloadWebsite::readOutput(){
while(getDownload->canReadLine()){
ui->textEdit->setText(getDownload->readLine());
}
// somebuffer.append(getDownload->readAllStandardOutput());
}
如您所见,还应调用 canReadLine
,因此 getDownload 必须可用。
我找到了一些解决方案。 (我是 Qt 的新手,但希望它能有所帮助):
mainwindow.h
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
signals:
void proccessFinished(int exitCode, QProcess::ExitStatus status);
public slots:
void runCommand();
void readCommand();
void stopCommand(int exitCode, QProcess::ExitStatus exitStatus);
//private or public?
private slots:
void error(QProcess::ProcessError error);
void stateChanged(QProcess::ProcessState state);
private:
Ui::MainWindow *ui;
QProcess *cmd;
};
mainwindow.cpp
include "mainwindow.h"
include "ui_mainwindow.h"
include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
cmd = new QProcess(this);
cmd->setProcessChannelMode(QProcess::MergedChannels);
//button click
connect(ui->btnRun, SIGNAL (clicked()), this, SLOT (runCommand()));
// process has some data to read
connect(cmd, SIGNAL (readyRead()), this, SLOT (readCommand()));
//process finished
connect(cmd, SIGNAL (finished(int, QProcess::ExitStatus)), this, SLOT (stopCommand(int, QProcess::ExitStatus)));
}
MainWindow::~MainWindow()
{
delete ui;
cmd->close(); //? how to do it right?
delete cmd;
}
void MainWindow::runCommand()
{
ui->output->append("Run process...");
cmd->start("ping -n 15 google.com");
// ??? the best way to continue here???
}
void MainWindow::readCommand(){
ui->output->append(cmd->readAll()); //output is QTextBrowser
}
void MainWindow::stopCommand(int exitCode, QProcess::ExitStatus exitStatus){
ui->output->append(cmd->readAll());
ui->output->append("cmd finished");
ui->output->append(QString::number(exitCode));
}
void MainWindow::error(QProcess::ProcessError error)
{
qDebug() <<"Error" << error;
}
void MainWindow::stateChanged(QProcess::ProcessState state)
{
qDebug() << "Process::stateChanged" << state;
}