带进度条的Web请求

时间:2014-11-16 02:56:56

标签: c++ qt


这是获取网页来源的代码(C ++:Qt):

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

有没有办法获得带有进度条的网页来源?!

1 个答案:

答案 0 :(得分: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++11CONFIG += c++11.pro文件)和new syntax of signals and slots