簡體   English   中英

Qt-如何將QProcess的stdout重定向到TextEdit

[英]Qt - How to redirect QProcess' stdout to TextEdit

我正在嘗試在小部件(textEdit)中使用wget打印下載網站的過程輸出,但是它什么也不會打印,但是在終端上可以正常工作。

命令:

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()));

在開始之前應先呼叫“課程連接”。 和信號處理程序:

void downloadWebsite::readOutput(){
    while(getDownload->canReadLine()){
       ui->textEdit->setText(getDownload->readLine());
    }
    // somebuffer.append(getDownload->readAllStandardOutput());
}

如您canReadLine還應調用canReadLine,因此getDownload必須可用。

我找到了一些解決方案。 (我是Qt新手,但希望能對您有所幫助):

主窗口

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;
};

主窗口

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM