如何增加QNetworkReply :: downloadProgress信号频率?
问题描述:
我正在尝试添加对Qt的FileDownloader示例的观察。
它的工作原理,但没有像我想要的那样 - downloadProgress
信号称为太稀罕了!
只有两次〜300 Kb文件。
如何增加QNetworkReply :: downloadProgress信号频率?
这使其无法在GUI中顺利显示下载进度。
代码:
...
QNetworkReply* reply = m_WebCtrl.get(request);
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), SLOT(onDownloadProgress(qint64,qint64)));
void FileDownloader::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
qDebug() << "Download progress:" << bytesReceived << bytesTotal;
}
输出:
Download progress: 19954 from -1 Download progress: 288322 from -1 Download progress: 288322 from 288322
有没有一种方法,使downloadProgress
信号来得更加频繁?
P.S. libcurl
进度回调日志:
Download progress: 2753 of 0 Download progress: 4141 of 0 Download progress: 5995 of 0 Download progress: 7383 of 0 ...
答
TL; DR最简单的方法是重新编译Qt和更改以下行:
// in qtbase/src/network/access/qnetworkreply.cpp
const int QNetworkReplyPrivate::progressSignalInterval = 100;
...用一个值(以毫秒为单位)是低于100.
如果你看Qt源代码为QNetworkReply
(和relat编班),你会发现以下内容:
if (downloadProgressSignalChoke.elapsed() >= progressSignalInterval) {
downloadProgressSignalChoke.restart();
emit q->downloadProgress(bytesDownloaded,
totalSize.isNull() ? Q_INT64_C(-1) : totalSize.toLongLong());
}
所以你可以看到什么控制信号的发射是downloadProgressSignalChoke
和progressSignalInterval
。
-
downloadProgressSignalChoke
是QElapsedTimer
是QNetworkReplyPrivate
私人的Qt类的成员,而且据我所知,你不能改变的时间返回(这是毫秒)。 -
progressSignalInterval
是QNetworkReplyPrivate
静态恒定构件,其值在qnetworkreply.cpp
定义100
:
const int QNetworkReplyPrivate::progressSignalInterval = 100;
这意味着该刷新间隔为(明显地)设定为常数100毫秒。
感谢这样有趣的想法,但我既没有时间也没有渴望重新编译Qt :( 所以我只写'libcurl' Qt-wrapper – eraxillan