c++ - 带有进度条的 Web 请求

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

有没有办法获取带进度条的网页源码?!

最佳答案

为此编写特殊类:

#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 .

关于c++ - 带有进度条的 Web 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26953253/

相关文章:

c++ - 继承的部分特化。我可以避免继承吗?

unit-testing - Qt 单元测试设置

Qt主窗口透明背景

c++ - 无法识别的命令行选项 '-WI'

c++ - 如何在 C++ 20 中执行链式协程

c++ - 调试进程加载异常0xc0000138(Ordinal not found)

c++ - 相当于 gnu 中 windows stdint.h 的 u_int16_t?

c++ - 为什么 param_type 构造函数对于随机分布是显式的?

qt - 在 Qt 编辑器中手动编辑 .ui 文件

android - 如何在 QtCreator 项目树(CMake-项目)中显示额外文件?