2013-06-03 3 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 или 5.x Qt? –

+0

Я использую Qt5.0 –

ответ

1

Вы должны поставить это:

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

перед:

штрафа
reply = netManager->get(request); 

работ после этой модификации;)

+0

Спасибо, это решило проблему :) –

+0

Рад помочь вам;) Слоты Netmanager и ответ ** onFinished ** используются одновременно, поэтому вы можете уйти с одного из них. – ariwez

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