2013-06-03 70 views
3

你好我編寫的程序應該下載網頁並保存爲一個文件。它做到了,但只有部分。有沒有人遇到過這樣的問題?http頁面沒有完全下載QT

mainwindow.cpp源文件:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QDebug> 
#include <QNetworkAccessManager> 

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    netManager = new QNetworkAccessManager; 
    setFile("myPage"); 
} 

MainWindow::~MainWindow() 
{ 
    netManager->deleteLater(); 
    delete ui; 
} 

void MainWindow::setFile(QString fileURL) 
{ 
    QString savePath; 

    savePath = QString("D:/page.html"); 

    QNetworkRequest request; 
    request.setUrl(QUrl(fileURL)); 
    reply = netManager->get(request); 

    file = new QFile; 
    file->setFileName(savePath); 
    file->open(QIODevice::WriteOnly); 

    connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(onProgress(qint64,qint64))); 
    connect(netManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onFinished(QNetworkReply*))); 
    connect(reply, SIGNAL(readyRead()), this, SLOT(onReadyRead())); 
    connect(reply, SIGNAL(finished()), this, SLOT(onReplyFinished())); 
} 

void MainWindow::onProgress(qint64 bRead, qint64 bTotal) 
{ 
    qDebug(QString::number(bRead).toLatin1() + " - " + QString::number(bTotal).toLatin1()); 
} 

void MainWindow::onFinished(QNetworkReply *reply) 
{ 
    switch (reply->error()) 
    { 
    case QNetworkReply::NoError: 
    { 
     qDebug("File downloaded"); 
     qDebug() << file->size(); 
    }break; 
    default: 
    { 
     qDebug(reply->errorString().toLatin1()); 
    } 
    } 
    if(file->isOpen()) 
    { 
     file->close(); 
     file->deleteLater(); 
    } 
} 

void MainWindow::onReadyRead() 
{ 
    file->write(reply->readAll()); 
} 

void MainWindow::onReplyFinished() 
{ 
    if(file->isOpen()) 
    { 
     file->close(); 
     file->deleteLater(); 
    } 
} 

mainwindow.h頭源文件:

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QNetworkAccessManager> 
#include <QFile> 
#include <QNetworkReply> 
#include <QNetworkReply> 
#include <QStringList> 

namespace Ui 
{ 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    void setFile(QString fileURL); 
private slots: 
    void onFinished(QNetworkReply *); 
    void onProgress(qint64 bRead, qint64 bTotal); 
    void onReadyRead(); 
    void onReplyFinished(); 
private: 
    Ui::MainWindow *ui; 
    QNetworkAccessManager *netManager; 
    QNetworkReply *reply; 
    QFile *file; 
}; 

#endif // MAINWINDOW_H 

我試圖解決它自己,但多次嘗試後,我失敗了。我是QT的初學者,所以我在某個地方犯了個錯誤,我甚至都沒有看到它。任何人都可以驅使我採取適當的方式解決問題嗎?

+0

你使用Qt 4.x或Qt的5.x的)? –

+0

我正在使用Qt5.0 –

回答

1

你應該把這個:

connect(netManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onFinished(QNetworkReply*))); 

前:這個修改後

reply = netManager->get(request); 

工作正常;

+0

謝謝,這解決了一個問題:) –

+0

很高興爲您提供幫助;)Netmanager的和答覆的** onFinished **插槽同時使用,因此您可以從其中一個插槽中退出。 – ariwez