2014-04-27 3 views
0

Я пытаюсь создать простое приложение GUI в QT Creator, которое использует wget для загрузки файлов с веб-сайтов. Я хочу видеть вывод wget в графическом интерфейсе.Отображение вывода консоли wget в Gui

Я хочу, чтобы этот вывод:

--2014-04-27 13:58:58-- http://google.com/ 
Resolving google.com (google.com)... 74.125.224.192, 74.125.224.193, 74.125.224.206, ... 
Connecting to google.com (google.com)|74.125.224.192|:80... connected. 
HTTP request sent, awaiting response... 301 Moved Permanently 
Location: http://www.google.com/ [following] 
--2014-04-27 13:58:58-- http://www.google.com/ 
Resolving www.google.com (www.google.com)... 74.125.224.210, 74.125.224.209, 74.125.224.208, ... 
Connecting to www.google.com (www.google.com)|74.125.224.210|:80... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: unspecified [text/html] 
Saving to: ‘index.html’ 

    [ <=>         ] 11,802  --.-K/s in 0.005s 

2014-04-27 13:58:58 (2.16 MB/s) - ‘index.html’ saved [11802] 

Это то, что я до сих пор. Он загружает файл, но я не вижу выхода в текстовом браузере. Я передаю вывод QProcess в текстовый браузер. Команды, такие как ls do отображение выход.

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QProcess> 
#include <stdlib.h> 
#include <string> 
using namespace std; 




MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    process = new QProcess(this); 
    //connect (process, SIGNAL(readyReadStandardOutput()), this, SLOT(printOutput())); 

} 



MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_pushButton_clicked() 
{ 
    ui->label->setText("Pressed!"); 



} 
void MainWindow::printOutput() 
{ 
    ui->display->setPlainText(process->readAllStandardOutput()); 
} 


void MainWindow::on_lineEdit_returnPressed() 
{ connect (process, SIGNAL(readyReadStandardOutput()), this, SLOT(printOutput())); 


    string result = "wget "; 
    result += ui->lineEdit->text().toStdString(); 

    ui->label->setText("Fetching..."); 
    QString lawl = QString::fromStdString(result); 

    options.clear(); 
#if defined(Q_OS_LINUX) 
    options << "-c" << lawl; 
    process->start("/bin/sh", options); 
#elif defined(Q_OS_WIN) 
    process->start(ui->lineEdit->text(), options); 
#endif 
    process->waitForFinished(); 

} 

С process->setProcessChannelMode(QProcess::MergedChannels);

Выход:

       129K=0.09s 

2014-04-27 19:11:14 (129 KB/s) - ‘index.html.3’ saved [11786] 
+0

Это может помочь: http://stackoverflow.com/questions/3852587/how-to-get-stdout-from-a-qprocess –

+0

@ 1.618 Спасибо! Он обеспечивает выход, но не совсем все. Я обновил вопрос с выходом. –

+0

'wget' может изменить свой вывод в зависимости от того, является ли его вывод терминалом или нет. (Он может обнаружить это через функцию 'isatty' C или эквивалент.) Если это так, вам нужно сделать некоторые« создания псевдо-TTY », чтобы заставить его выводить то, что вы хотите (у меня нет подробных сведений ; Прости). –

ответ

0

Wget рисует индикатор, используя управляющие последовательности (возможно, с использованием ругательства). Я предполагаю, что это мешает объекту QProcess правильно отображать вывод. Не похоже, что есть способ отключить только индикатор выполнения, не отключая остальную часть подробного вывода.

В качестве обходного пути вы можете использовать опцию -o, чтобы сделать wget-журнал в файл. Когда процесс завершится, прочитайте и покажите файл.

Смежные вопросы