2014-11-16 3 views
1


Это мой код (C++: Qt) для получения источника веб-страницы:

Web запрос с прогресс бар

QString htmlString; 

QEventLoop eventLoop; 

QNetworkAccessManager mgr; 
QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); 

QNetworkRequest req(QUrl(QString("http://stackoverflow.com"))); 
QNetworkReply *reply = mgr.get(req); 
eventLoop.exec(); 

htmlString = reply->readAll(); 

Есть ли способ, чтобы получить источник веб-страницы с прогресс бар?!

ответ

2

Написать специальный класс для этого:

#ifndef DOWNLOADER_H 
#define DOWNLOADER_H 

#include <QObject> 
#include <QNetworkAccessManager> 
#include <QNetworkRequest> 
#include <QNetworkReply> 
#include <QUrl> 
#include <QDebug> 
#include <QProgressBar> 


class Downloader : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Downloader(QObject *parent = 0); 

    void doDownload(); 

public slots: 
    void replyFinished (QNetworkReply *reply); 
    void updateDownloadProgress(qint64, qint64); 

private: 
    QNetworkAccessManager *manager; 
    QProgressBar *bar; 

}; 

#endif 

Cpp:

Downloader::Downloader(QObject *parent) : 
    QObject(parent) 
{ 
} 

void Downloader::doDownload() 
{ 
    manager = new QNetworkAccessManager(this); 

    connect(manager, SIGNAL(finished(QNetworkReply*)), 
      this, SLOT(replyFinished(QNetworkReply*))); 

    QNetworkReply * rep = manager->get(QNetworkRequest(QUrl("http://qt-project.org/"))); 
    connect(rep, SIGNAL(downloadProgress(qint64, qint64)), 
      this, SLOT(updateDownloadProgress(qint64, qint64))); 
    bar = new QProgressBar; 
    bar->show(); 
} 

void Downloader::replyFinished (QNetworkReply *reply) 
{ 
    if(reply->error()) 
    { 
     qDebug() << "ERROR!"; 
     qDebug() << reply->errorString(); 
    } 
    else 
    { 
     qDebug() << reply->readAll(); 
    } 

    reply->deleteLater(); 
} 

void Downloader::updateDownloadProgress(qint64 read, qint64 total) 
{ 
    qDebug() << read << total; 
    bar->setMaximum(total); 
    bar->setValue(read); 
} 

Использование:

Downloader down; 
down.doDownload(); 

Основная идея здесь заключается в использовании void QNetworkReply::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) [signal] получить прогресс и показать прогресс в QProgressBar.

И вы можете сделать это с текущим кодом без класса:

QString htmlString; 
QEventLoop eventLoop; 
QNetworkAccessManager mgr; 
QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); 
QProgressBar *bar = new QProgressBar; 
bar->show(); 

QNetworkRequest req(QUrl(QString("http://stackoverflow.com"))); 
QNetworkReply *reply = mgr.get(req); 

QObject::connect(reply,&QNetworkReply::downloadProgress,[=](qint64 bytesReceived, qint64 bytesTotal) {//with lambda 
    bar->setMaximum(bytesTotal); 
    bar->setValue(bytesReceived); 
}); 

eventLoop.exec(); 
htmlString = reply->readAll(); 
qDebug() << htmlString; 

Я здесь C++11 (CONFIG += c++11 в .pro файл) и new syntax of signals and slots.

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