获取从 QNetworkReply 下载的百分比
Getting the percentage downloaded from a QNetworkReply
我正在尝试获取正在下载文件时从 QNetworkReply 下载的百分比:
connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(getDownloadData(qint64, qint64)) );
但是当我测试我的程序时,我总是得到:
进度:
100
它输出两次,我从来没有得到低于 100 的任何东西。我希望每次下载进度变化时都发出信号。
我怎样才能做到这一点?或者我在我的代码中犯了一个阻止它发生的错误?
编辑:@dubsjw 指出我使用 int 时出现舍入错误。现在,对于大图像,随着时间的推移,我从 0 增加到 100,但对于小图像,我仍然只得到 progress: 0 和 progress: 100,两者之间什么都没有。我想发出一个由进度条接收的信号,进度条从 0 平滑地增加到 100。我该怎么做?
filedownloader.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
filedownloader.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;
}
您要求传递给 get 函数的地址是否有效?那时我会尝试调试语句,看看您是否得到了您期望的结果。另外,检查 getDownloadData() 函数被调用了多少次。如果您看到它被调用一次,读取值和总值都为 0,那么您就知道您没有有效的请求。
我正在尝试获取正在下载文件时从 QNetworkReply 下载的百分比:
connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(getDownloadData(qint64, qint64)) );
但是当我测试我的程序时,我总是得到:
进度: 100
它输出两次,我从来没有得到低于 100 的任何东西。我希望每次下载进度变化时都发出信号。
我怎样才能做到这一点?或者我在我的代码中犯了一个阻止它发生的错误?
编辑:@dubsjw 指出我使用 int 时出现舍入错误。现在,对于大图像,随着时间的推移,我从 0 增加到 100,但对于小图像,我仍然只得到 progress: 0 和 progress: 100,两者之间什么都没有。我想发出一个由进度条接收的信号,进度条从 0 平滑地增加到 100。我该怎么做?
filedownloader.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
filedownloader.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;
}
您要求传递给 get 函数的地址是否有效?那时我会尝试调试语句,看看您是否得到了您期望的结果。另外,检查 getDownloadData() 函数被调用了多少次。如果您看到它被调用一次,读取值和总值都为 0,那么您就知道您没有有效的请求。