如何增加 QNetworkReply::downloadProgress 信号频率?
Posted
技术标签:
【中文标题】如何增加 QNetworkReply::downloadProgress 信号频率?【英文标题】:How to increase QNetworkReply::downloadProgress signal frequency? 【发布时间】:2017-04-04 10:09:27 【问题描述】:我正在尝试将进度观察添加到 Qt 的 FileDownloader 示例中。
它有效,但不是我想要的方式 - downloadProgress
信号太罕见了!
约 300 Kb 文件只需两次。
这导致无法在 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
信号更频繁地出现?
附: libcurl
进度回调日志:
Download progress: 2753 of 0
Download progress: 4141 of 0
Download progress: 5995 of 0
Download progress: 7383 of 0
...
【问题讨论】:
【参考方案1】:TL;DR 最简单的方法是重新编译 Qt 并更改以下行:
// in qtbase/src/network/access/qnetworkreply.cpp
const int QNetworkReplyPrivate::progressSignalInterval = 100;
...具有小于 100 的值(以毫秒为单位)。
如果您查看QNetworkReply
(和相关类)的 Qt 源代码,您会发现以下内容:
if (downloadProgressSignalChoke.elapsed() >= progressSignalInterval)
downloadProgressSignalChoke.restart();
emit q->downloadProgress(bytesDownloaded,
totalSize.isNull() ? Q_INT64_C(-1) : totalSize.toLongLong());
所以你可以看到控制信号发射的是downloadProgressSignalChoke
和progressSignalInterval
。
downloadProgressSignalChoke
是 QElapsedTimer
,它是私有 Qt 类 QNetworkReplyPrivate
的成员,据我所知,您无法更改返回的持续时间(以毫秒为单位)。
progressSignalInterval
是QNetworkReplyPrivate
的静态常量成员,其值在qnetworkreply.cpp
到100
中定义:
const int QNetworkReplyPrivate::progressSignalInterval = 100;
这意味着刷新间隔(显然)设置为恒定的 100 毫秒。
【讨论】:
感谢这个有趣的想法,但我既没有时间也不想重新编译 Qt :( 所以我就写libcurl
Qt-wrapper以上是关于如何增加 QNetworkReply::downloadProgress 信号频率?的主要内容,如果未能解决你的问题,请参考以下文章