【问题标题】:Getting the percentage downloaded from a QNetworkReply获取从 QNetworkReply 下载的百分比
【发布时间】:2015-01-20 17:02:29
【问题描述】:

我正在尝试获取从 QNetworkReply 下载的百分比,因为正在下载文件:

connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(getDownloadData(qint64, qint64)) );

但是当我测试我的程序时,我总是得到:

进展: 100

输出两次,我从来没有得到低于 100 的任何东西。我希望每次下载进度发生变化时都发出信号。

我怎样才能做到这一点?还是我在代码中犯了一个错误,阻止了它的发生?

编辑:@dubsjw 指出我使用 int 存在舍入错误。现在,随着时间的推移,对于大图像,我从 0 增加到 100,但对于小图像,我仍然只得到 progress: 0 和 progress: 100,中间没有任何内容。我想发出一个由进度条接收的信号,该信号从 0 平滑增加到 100。我该怎么做?

文件下载器.h:

#ifndef FILEDOWNLOADER_H
#define FILEDOWNLOADER_H

#include <QObject>
#include <QByteArray>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

class FileDownloader : public QObject
{
    Q_OBJECT
public:
    explicit FileDownloader(QUrl imageUrl, QObject *parent = 0);

    virtual ~FileDownloader();

    QByteArray downloadedData() const;



signals:
        void downloaded();

private slots:

    void fileDownloaded();
   void  getDownloadData(qint64 read, qint64 total);

private:

    QNetworkAccessManager m_WebCtrl;
    QByteArray m_DownloadedData;
    QNetworkReply* reply;

};

#endif // FILEDOWNLOADER_H

文件下载器.cpp:

#include "filedownloader.h"

FileDownloader::FileDownloader(QUrl imageUrl, QObject *parent) :
    QObject(parent)
{
    QNetworkRequest request(imageUrl);
    reply = m_WebCtrl.get(request);

    connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(getDownloadData(qint64, qint64)) );

    connect(reply, SIGNAL(finished()),this, SLOT(fileDownloaded()));


}

FileDownloader::~FileDownloader()
{

}

void FileDownloader::fileDownloaded()
{
    m_DownloadedData = reply->readAll();
    //emit a signal
    reply->deleteLater();
    emit downloaded();
}

QByteArray FileDownloader::downloadedData() const
{
    return m_DownloadedData;
}

 void FileDownloader::getDownloadData(qint64 read, qint64 total)
 {

     qDebug() << "Progress:";
     qint64 percent = (read / total) * 100;
     qDebug() << percent;
 }

【问题讨论】:

    标签: c++ qt qnetworkreply


    【解决方案1】:

    您向 get 函数传递的请求是否是有效地址?那时我会尝试一个调试语句,看看你是否得到了你所期望的。此外,请检查 getDownloadData() 函数被调用了多少次。如果您看到它被调用一次,读取值和总值都为 0,那么您就知道您没有有效的请求。

    【讨论】:

    • 我的完整程序显示已下载的图像。我知道它正在工作,因为图像已显示。
    • 图片下载需要多长时间,尝试更大的文件大小,看看它是否打印更频繁并保持在100。
    • 我认为这可能是因为图像尺寸很小,但我尝试了一个大图像,下载大约需要 10 秒。 Progress: 0 打印了多次,然后 Progress: 100 打印了一次,中间没有任何内容。
    • 是不是因为你使用的是整数而不是浮点数。可能是四舍五入乘以 100,不敢相信我之前没有注意到。
    • 有很多方法可以解决。如果你真的想伪造它,你可以有一个占位符,当你检查实际下载进度时,如果下载进度高于该阈值,则将数字增加 1。这样你就可以达到每一个百分比并且它会平稳上升。
    猜你喜欢
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多